Spring注释@Controller
与@Service
相同吗?
我知道@Controller
可以用于URL
映射和调用业务逻辑。
而@Service
用于注释包含业务逻辑的服务类。
我可以使用@Controller
代替@Service
来注释服务类吗?
答案 0 :(得分:102)
不,他们彼此差异很大。
两者都是 @Component 注释的不同特化(实际上,它们是同一接口的两个不同实现),因此两者都可以通过类路径扫描发现(如果您在XML中声明它)配置)
@Service 注释在您的服务层中使用,并注释执行服务任务的类,通常您不使用它,但在许多情况下,您使用此注释来表示最佳实践。例如,您可以直接调用DAO类来将对象持久保存到您的数据库,但这很糟糕。调用调用DAO的服务类非常好。执行关注模式分离是一件好事。
@Controller 注释是Spring MVC框架(用于实现Web应用程序的Spring Framework的组件)中使用的注释。 @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();
}
这个类是一个控制器。
此类处理“/ appointment”“文件夹”的所有HTTP请求,特别是get方法是调用处理文件夹“/ appointment”的所有GET HTTP请求的方法。
我希望现在对你来说更清楚。
答案 1 :(得分:27)
如果您查看@Service
,@Component
注释的定义,那么您会发现这些是@Component
public @interface Service {
….
}
注释的特殊类型。
@Component
public @interface Controller {
…
}
@Controller
那有什么区别?
<强> @Controller 强>
@Controller
注释表示特定类充当控制器的角色。 @Service
注释充当带注释的类的构造型,指示其角色。
@Controller有什么特别之处?
您无法将此注释与@Repository
或@Controller
等任何其他注释切换,即使它们看起来相同。
调度程序扫描带有@RequestMapping
注释的类,并检测其中的@RequestMapping
注释。您只能在@Controller
带注释的类上使用@Services
。
<强> @服务强>
{{1}}在存储库层中保存业务逻辑和调用方法。
@Service有什么特别之处?
除了它用于表示它持有业务逻辑这一事实之外,这个注释没有明显的特点,但是谁知道,spring可能在未来增加一些额外的特殊功能。
链接回答:What's the difference between @Component, @Repository & @Service annotations in Spring?
答案 2 :(得分:7)
不,@Controller
与@Service
不同,尽管它们都是@Component
的特化,因此它们都是通过类路径扫描进行发现的候选者。 @Service
注释用于服务层,@Controller
用于表示层中的Spring MVC控制器。 @Controller
通常会有一个URL映射,并由Web请求触发。
答案 3 :(得分:4)
@Service vs @Controller
@Service:class是&#34; Business Service Facade&#34; (在核心J2EE模式意义上)或类似的东西。
@Controller:表示带注释的类是&#34; Controller&#34; (例如网络控制器)。
----------查找有关主要刻板印象的有用说明 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@interface Component
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface Component
表示带注释的类是组件。在使用基于注释的配置和类路径扫描时,此类被视为自动检测的候选者。
@interface Controller
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
表示带注释的类是&#34;控制器&#34; (例如网络控制器)。
@ 界面服务
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
表示带注释的类是&#34; Service&#34;,最初由Domain-Driven Design(Evans,2003)定义为&#34;作为独立于模型中的接口提供的操作,没有封装状态。&#34; 也可能表明一个班级是一个商业服务门面&#34; (在核心J2EE模式意义上),或类似的东西。这个注释是一个通用的刻板印象,个别团队可能会缩小其语义并在适当时使用。
@interface Repository
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
表示带注释的类是&#34;存储库&#34;,最初由域驱动设计(Evans,2003)定义为&#34;封装存储,检索和搜索行为的机制,用于模拟对象的集合&#34;。 实现传统J2EE模式的团队,例如&#34;数据访问对象&#34;也可以将此构造型应用于DAO类,但在这样做之前应注意理解数据访问对象和DDD样式存储库之间的区别。这个注释是一个通用的刻板印象,个别团队可能会缩小其语义并在适当时使用。
当与PersistenceExceptionTranslationPostProcessor一起使用时,这样注释的类有资格进行Spring DataAccessException转换。带注释的类还阐明了它在整个应用程序体系结构中的作用,以用于工具,方面等。
从Spring 2.5开始,这个注释也作为@Component的一个特化,允许通过类路径扫描自动检测实现类。
答案 4 :(得分:1)
我已在此处Here is the Link
回答了类似的问题两者都不相同。
@Service注释用于其他目的,而@Controller用于其他用途。 实际上Spring @Component,@ Service,@ Repository和@Controller注释用于在Spring框架中使用类路径扫描进行自动bean检测,但它 并不意味着所有功能都相同。 @Service:它表示带注释的类是业务层中的服务组件。
@Controller:带注释的类表示它是一个控制器组件,主要用于表示层。
答案 5 :(得分:0)
不,你不能与众不同。部署应用程序时,您的控制器映射将会受到限制。
无论如何,你想要一个控制器不一个服务,反之亦然。
答案 6 :(得分:0)
从Spring in Action
如您所见,该类使用@Controller进行注释。就其本身而言,@ Controller并没有做什么。其主要目的是将此类识别为组件扫描的组件。由于HomeController带有@Controller注释,因此Spring的组件扫描会自动发现它,并在Spring应用程序上下文中将HomeController的实例创建为Bean。
实际上,少数其他注释(包括@ Component,@ Service和@Repository)的作用类似于@Controller。您可以使用其他任何注释同样有效地对HomeController进行注释,并且仍然可以使用相同的注释。但是,@ Controller的选择更能说明该组件在应用程序中的角色。
答案 7 :(得分:0)
您可以将 @service 声明为 @Controller 。
您可以不将 @Controller 声明为 @Service
@服务
这很正常。您只是将类声明为组件。
@Controller
它比Component更特殊。 调度程序将在此处搜索 @RequestMapping 。 因此,用@Controller注释的类将另外具有声明通过其调用API的URL的权限。
答案 8 :(得分:0)