Spring注解是否@Controller
相同@Service
?
我知道@Controller
哪些可以用于URL
映射和调用业务逻辑。
而@Service
用于注释包含业务逻辑的服务类。
我可以使用@Controller
而不是@Service
注释服务类吗?
Spring注解是否@Controller
相同@Service
?
我知道@Controller
哪些可以用于URL
映射和调用业务逻辑。
而@Service
用于注释包含业务逻辑的服务类。
我可以使用@Controller
而不是@Service
注释服务类吗?
不,它们彼此非常不同。
两者都是@Component注释的不同特化(实际上,它们是同一接口的两个不同实现),因此可以通过类路径扫描发现两者(如果您在 XML 配置中声明它)
@Service注释用于您的服务层并注释执行服务任务的类,通常您不使用它,但在许多情况下您使用此注释来表示最佳实践。例如,您可以直接调用 DAO 类来将对象持久保存到数据库中,但这很糟糕。调用一个调用 DAO 的服务类是很不错的。这是执行关注点分离模式的一件好事。
@Controller注解是 Spring MVC 框架中使用的注解(Spring 框架中用于实现 Web 应用程序的组件)。@Controller 注解表明一个特定的类充当控制器的角色。@Controller 注解充当注解类的构造型,指示其角色。调度程序扫描这些带注释的类以查找映射方法并检测@RequestMapping 注释。
因此,查看 Spring MVC 架构,您有一个 DispatcherServlet 类(您在 XML 配置中声明),它代表一个前端控制器,它将所有 HTTP 请求分派到适当的控制器类(由 @Controller 注释)。此类通过其方法执行业务逻辑(并可以调用服务)。这些类(或其方法)通常也使用@RequestMapping注释来指定控制器及其方法处理的 HTTP 请求。
例如:
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook;
@Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
}
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
}
这个类是一个控制器。
此类处理向“/appointments”“文件夹”发出的所有 HTTP 请求,特别是 get 方法是为处理向“/appointments”文件夹发出的所有 GET HTTP 请求而调用的方法。
我希望现在对你来说更清楚了。
如果你查看@Controller
,@Service
注释的定义,你会发现这些是特殊类型的@Component
注释。
@Component
public @interface Service {
….
}
@Component
public @interface Controller {
…
}
那么有什么区别呢?
@控制器
@Controller
注释表明一个特定的类充当控制器的角色。@Controller
注释充当被注释类的构造型,指示其角色。
@Controller 有什么特别之处?
您不能使用任何其他类似@Service
或来切换此注释@Repository
,即使它们看起来相同。调度程序扫描带有注释的类@Controller
并检测@RequestMapping
其中的注释。您只能@RequestMapping
在@Controller
带注释的类上使用。
@服务
@Services
在存储层中保存业务逻辑和调用方法。
@Service 有什么特别之处?
除了用来表示它持有业务逻辑的事实之外,这个注解并没有提供明显的特殊性,但谁知道,spring 将来可能会添加一些额外的异常。
不,@Controller
与 不同@Service
,尽管它们都是 的特化@Component
,使它们都成为通过类路径扫描发现的候选者。@Service
注释用于您的服务层,用于@Controller
表示层中的 Spring MVC 控制器。A@Controller
通常会有一个 URL 映射并由 Web 请求触发。
@Service 与 @Controller
@Service :类是“业务服务外观”(在核心 J2EE 模式意义上),或类似的东西。
@Controller :表示一个带注释的类是一个“控制器”(例如一个网络控制器)。
----------找到关于主要刻板印象的有用注释 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@interface 组件
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface Component
指示带注释的类是一个组件。在使用基于注释的配置和类路径扫描时,此类类被视为自动检测的候选对象。
@接口控制器
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
表示一个带注释的类是一个“控制器”(例如一个网络控制器)。
@接口服务
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
表示带注释的类是“服务”,最初由域驱动设计(Evans,2003)定义为“作为独立于模型中的接口提供的操作,没有封装状态。” 也可能表明一个类是“业务服务外观”(在核心 J2EE 模式意义上),或类似的东西。此注释是通用的刻板印象,各个团队可能会缩小其语义并酌情使用。
@interface 存储库
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
表示带注释的类是“存储库”,最初由域驱动设计(Evans,2003)定义为“一种模拟对象集合的封装存储、检索和搜索行为的机制”。实现传统 J2EE 模式(如“数据访问对象”)的团队也可以将此原型应用于 DAO 类,但在这样做之前应注意了解数据访问对象和 DDD 样式存储库之间的区别。此注释是通用的刻板印象,各个团队可能会缩小其语义并酌情使用。
这样注释的类在与 PersistenceExceptionTranslationPostProcessor 结合使用时有资格进行 Spring DataAccessException 转换。注释类也被阐明了它在整个应用程序架构中的作用,用于工具、方面等。
从 Spring 2.5 开始,这个注解也作为 @Component 的一个特化,允许通过类路径扫描自动检测实现类。
我已经在这里回答了类似的问题这是链接
没有两者是不同的。
@Service 注释用于其他目的,@Controller 用于其他目的。实际上 Spring 的 @Component、@Service、@Repository 和 @Controller 注解用于在 Spring 框架中使用类路径扫描进行自动 bean 检测,但这并不意味着所有功能都是相同的。@Service:表示注解的类是业务层的Service组件。
@Controller:带注解的类表示它是一个控制器组件,主要用于表示层。
您可以将@service声明为@Controller。
您不能将@Controller声明为@Service
@服务
这是常规的。您只是将类声明为组件。
@控制器
它比 Component 稍微特别一点。调度程序将在此处搜索@RequestMapping。因此,使用 @Controller 注释的类将另外被授权声明通过其调用 API 的 URL
不,你不能他们是不同的。例如,在部署应用程序时,您的控制器映射将被破坏。
反正你为什么要这样,控制器不是服务,反之亦然。
从春天在行动
如你所见,这个类是用@Controller 注解的。就其本身而言,@Controller 并没有做太多事情。其主要目的是将此类标识为组件扫描的组件。因为 HomeController 使用 @Controller 注解,所以 Spring 的组件扫描会自动发现它并在 Spring 应用程序上下文中创建 HomeController 的实例作为 bean。
事实上,少数其他注解(包括@Component、@Service 和@Repository)的用途类似于@Controller。您可以使用任何其他注释来有效地注释 HomeController,它仍然可以正常工作。然而,@Controller 的选择更能描述该组件在应用程序中的作用。
两者都是@Component注解的特殊形式。@controller 和 @serviec 都共享 @component 注释的相同功能以及它们自己的功能。
@Controller是一个类级别的注解,它将类标记为 Web 请求处理程序。进一步的解释可以参考这个网站:https ://www.baeldung.com/spring-controller-vs-restcontroller
@Service也是一个类级别的注解,它包含一个业务逻辑。进一步的解释可以参考这个网站:https ://www.baeldung.com/spring-component-repository-service