春天注释@Controller
和@Service
一样吗?
我有关于@Controller
的想法,它可以用于URL
映射和调用业务逻辑。
而@Service
用于注释包含业务逻辑的服务类。
我可以使用@Controller
而不是@Service
来注释服务类吗?
不,他们彼此差异很大。
两者都是@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请求的方法。
我希望现在对你来说更清楚了。
如果你看看@Controller
,@Service
注释的定义,那么你会发现这些是特殊类型的@Component
注释。
@Component
public @interface Service {
….
}
@Component
public @interface Controller {
…
}
那有什么区别?
@Controller
@Controller
注释表示特定类用作控制器的角色。 @Controller
注释充当注释类的构造型,指示其作用。
@Controller有什么特别之处?
您无法将此注释与@Service
或@Repository
等任何其他注释切换,即使它们看起来相同。调度程序扫描用@Controller
注释的类,并检测其中的@RequestMapping
注释。你只能在@RequestMapping
注释类上使用@Controller
。
@服务
@Services
在存储库层中保存业务逻辑和调用方法。
@Service有什么特别之处?
除了它用于表明它持有业务逻辑这一事实之外,这个注释没有明显的特点,但是谁知道,spring可能在未来增加一些额外的特殊功能。
链接答案:What's the difference between @Component, @Repository & @Service annotations in Spring?
不,@Controller
与@Service
不同,虽然它们都是@Component
的特化,因此它们都是通过类路径扫描发现的候选者。 @Service
注释用于服务层,@Controller
用于表示层中的Spring MVC控制器。 @Controller
通常具有URL映射并由Web请求触发。
@Service vs @Controller
@Service:class是一个“Business Service Facade”(在Core J2EE模式意义上),或类似的东西。
@Controller:表示带注释的类是“Controller”(例如Web控制器)。
----------查找有关主要刻板印象的有用说明qazxsw poi
@interface组件
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
表示带注释的类是“控制器”(例如Web控制器)。
@interface服务
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
表示带注释的类是“服务”,最初由域驱动设计(Evans,2003)定义为“作为模型中独立的接口提供的操作,没有封装状态”。也可能表明一个类是“业务服务门面”(在核心J2EE模式意义上)或类似的东西。这个注释是一个通用的刻板印象,个别团队可能会缩小其语义并在适当时使用。
@interface存储库
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
表示带注释的类是“存储库”,最初由域驱动设计(Evans,2003)定义为“用于封装模拟对象集合的存储,检索和搜索行为的机制”。实现传统J2EE模式(如“数据访问对象”)的团队也可以将此构造型应用于DAO类,但在此之前应注意理解数据访问对象和DDD样式存储库之间的区别。这个注释是一个通用的刻板印象,个别团队可能会缩小其语义并在适当时使用。
当与PersistenceExceptionTranslationPostProcessor一起使用时,这样注释的类有资格进行Spring DataAccessException转换。为了工具,方面等目的,注释类还阐明了它在整个应用程序体系结构中的作用。
从Spring 2.5开始,这个注释也可以作为@Component的特化,允许通过类路径扫描自动检测实现类。
我已经在这里回答了类似的问题@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
两者都不相同。
@Service注释用于其他目的,@ Controller用于其他用途。实际上Spring @Component,@ Service,@ Repository和@Controller注释用于在Spring框架中使用类路径扫描进行自动bean检测,但它并不意味着所有功能都相同。 @Service:它表示带注释的类是业务层中的Service组件。
@Controller:带注释的类表示它是一个控制器组件,主要用于表示层。
不,你不能,他们是不同的。部署应用程序时,您的控制器映射将被例外。
无论如何,你为什么要控制器不是服务,反之亦然。
从Spring In Action
如您所见,此类使用@Controller注释。 @Controller本身并没有做太多。其主要目的是将此类识别为组件扫描的组件。因为HomeController是用@Controller注释的,所以Spring的组件扫描会自动发现它并在Spring应用程序上下文中创建一个HomeController实例作为bean。
实际上,一些其他注释(包括@ Component,@ Service和@Repository)的用途与@Controller类似。您可以使用任何其他注释同样有效地注释HomeController,它仍然可以使用相同的。但是,@ Controller的选择更能描述该组件在应用程序中的作用。