Spring注解@Controller和@Service一样吗?
Posted
技术标签:
【中文标题】Spring注解@Controller和@Service一样吗?【英文标题】:Is Spring annotation @Controller same as @Service? 【发布时间】:2013-04-10 10:13:10 【问题描述】:Spring注解@Controller
和@Service
一样吗?
我知道@Controller
可用于URL
映射和调用业务逻辑。
而@Service
用于注解包含业务逻辑的服务类。
我可以使用@Controller
代替@Service
来注释Service 类吗?
【问题讨论】:
【参考方案1】:不,它们彼此非常不同。
两者都是 @Component 注释的不同特化(实际上,它们是同一接口的两个不同实现),因此可以通过类路径扫描发现两者(如果您在 XML 中声明它配置)
@Service 注释用于您的服务层并注释执行服务任务的类,通常您不使用它,但在许多情况下您使用此注释来表示最佳实践。例如,您可以直接调用 DAO 类来将对象持久保存到数据库中,但这很糟糕。调用一个调用 DAO 的服务类是很不错的。执行关注点分离模式是一件好事。
@Controller注解是Spring MVC框架(用于实现Web应用程序的Spring框架组件)中使用的注解。 @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请求的方法。
我希望现在你更清楚了。
【讨论】:
很好的解释。值得一提的是,(at)controller 类不需要有 (at)RequestMapping,(at)RequestMapping 也可以是方法级别。 我可以将它们混合在单个类定义中吗?还是将它们作为单独的类实现更好?【参考方案2】:如果你查看@Controller
、@Service
注解的定义,你会发现这些是@Component
注解的特殊类型。
@Component
public @interface Service
….
@Component
public @interface Controller
…
那么有什么区别呢?
@Controller
@Controller
注释表示特定类充当控制器的角色。 @Controller
注解充当被注解类的原型,指示其角色。
@Controller 有什么特别之处?
您不能将此注释与@Service
或@Repository
之类的任何其他注释进行切换,即使它们看起来相同。
调度程序扫描带有@Controller
注释的类,并在其中检测@RequestMapping
注释。您只能在 @Controller
带注释的类上使用 @RequestMapping
。
@Service
@Services
在repository层保存业务逻辑和调用方法。
@Service 有什么特别之处?
除了用来表示它持有业务逻辑之外,这个注解并没有提供明显的特殊性,但谁知道呢,spring 将来可能会添加一些额外的异常。
链接答案:What's the difference between @Component, @Repository & @Service annotations in Spring?
【讨论】:
【参考方案3】:不,@Controller
与 @Service
不同,尽管它们都是 @Component
的特化,因此它们都是类路径扫描发现的候选对象。 @Service
注解用于服务层,@Controller
用于表示层中的 Spring MVC 控制器。 @Controller
通常具有 URL 映射并由 Web 请求触发。
【讨论】:
【参考方案4】:@Service 与 @Controller
@Service :类是“业务服务外观”(在核心 J2EE 模式意义上)或类似的东西。
@Controller : 表示带注释的类是“控制器”(例如 Web 控制器)。
---------找到关于主要刻板印象的有用注释 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@接口组件
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface Component
表明一个带注释的类是一个组件。在使用基于注释的配置和类路径扫描时,此类类被视为自动检测的候选对象。
其他类级别的注释也可以被认为是标识一个组件,通常是一种特殊类型的组件:例如@Repository 注释或 AspectJ 的 @Aspect 注释。
@接口控制器
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
表示带注释的类是“控制器”(例如 Web 控制器)。
这个注解作为@Component 的一个特化,允许通过类路径扫描自动检测实现类。它通常与基于 RequestMapping 注解的注解处理程序方法结合使用。
@接口服务
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
表示带注释的类是“服务”,最初由域驱动设计(Evans,2003 年)定义为“作为独立于模型中的接口提供的操作,没有封装状态。” 也可能表明一个类是“业务服务外观”(在核心 J2EE 模式意义上),或类似的东西。此注释是通用的刻板印象,各个团队可以缩小其语义并酌情使用。
这个注解作为@Component 的一个特化,允许通过类路径扫描自动检测实现类。
@interface 存储库
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
表示带注释的类是“存储库”,最初由域驱动设计(Evans,2003 年)定义为“一种模拟对象集合的封装存储、检索和搜索行为的机制”。 实现传统 J2EE 模式(如“数据访问对象”)的团队也可以将此原型应用于 DAO 类,但在这样做之前应注意了解数据访问对象和 DDD 样式存储库之间的区别。此注释是通用的刻板印象,各个团队可以缩小其语义并酌情使用。
这样注释的类在与 PersistenceExceptionTranslationPostProcessor 结合使用时有资格进行 Spring DataAccessException 转换。还阐明了带注释的类在整个应用程序架构中的作用,用于工具、方面等目的。
从 Spring 2.5 开始,这个注解也作为 @Component 的一个特化,允许通过类路径扫描自动检测实现类。
【讨论】:
【参考方案5】:我已经在这里Here is the Link回答了类似的问题
两者都不一样。
@Service 注释用于其他用途,@Controller 用于其他用途。 实际上 Spring 的 @Component、@Service、@Repository 和 @Controller 注解用于在 Spring 框架中使用类路径扫描进行自动 bean 检测,但它 并不意味着所有功能都是相同的。 @Service:表示注解的类是业务层的Service组件。
@Controller:注解类表示它是一个控制器组件,主要用于表现层。
【讨论】:
【参考方案6】:您可以将 @service 声明为 @Controller。
您可以不将 @Controller 声明为 @Service
@Service
这是正常的。您只是将类声明为组件。
@Controller
它比组件更特别一点。 dispatcher 将在此处搜索 @RequestMapping。 因此,使用 @Controller 注释的类将另外有权声明通过其调用 API 的 URL
【讨论】:
【参考方案7】: 控制器将处理不同视图之间的导航。您的映射请求映射是在控制器的帮助下处理的。 服务直接与通常执行业务逻辑的存储库交互。您可以在服务层添加,删除,删除等【讨论】:
【参考方案8】:不,你不能他们是不同的。例如,在部署应用程序时,您的控制器映射将被破坏。
你为什么要这样做,控制器不是服务,反之亦然。
【讨论】:
【参考方案9】:来自春天的行动
如你所见,这个类是用@Controller 注解的。就其本身而言,@Controller 并没有做太多的事情。其主要目的是将此类标识为组件扫描的组件。因为 HomeController 使用 @Controller 注解,所以 Spring 的组件扫描会自动发现它并在 Spring 应用程序上下文中创建 HomeController 的实例作为 bean。
事实上,一些其他注解(包括@Component、@Service 和@Repository)的用途类似于@Controller。您可以使用任何其他注释来有效地注释 HomeController,它仍然可以正常工作。然而,@Controller 的选择更能描述该组件在应用程序中的作用。
【讨论】:
【参考方案10】:两者都是@Component注解的特殊形式。 @controller 和 @serviec 都共享 @component 注释的相同功能以及它们自己的功能。
@Controller 是一个类级别的注解,它将类标记为 Web 请求处理程序。进一步的解释可以参考这个网站:https://www.baeldung.com/spring-controller-vs-restcontroller
@Service 也是一个类级别的注解,它包含一个业务逻辑。 进一步的解释可以参考这个网站:https://www.baeldung.com/spring-component-repository-service
【讨论】:
以上是关于Spring注解@Controller和@Service一样吗?的主要内容,如果未能解决你的问题,请参考以下文章
@Component, @Controller, @Repository, @Service 有何区别?
Spring注解@Controller和@Service一样吗?
spring的注解形式:@Repository@Service@Controller,
Spring MVC 常用注解@Controller,@RequestMapping,Model和ModelAndView