Spring注解@Controller
与相同@Service
吗?
我知道@Controller
哪个可用于URL
映射和调用业务逻辑。
而@Service
用于注释包含业务逻辑的服务类。
我可以用来@Controller
代替@Service
Service类吗?
Answers:
不,它们彼此非常不同。
两者都是@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请求的方法。
我希望现在对您来说更加清楚。
如果你看的定义@Controller
,@Service
注释,那么你会发现,这些特殊类型的@Component
注释。
@Component
public @interface Service {
….
}
@Component
public @interface Controller {
…
}
那有什么区别呢?
@Controller
该@Controller
注解表明特定类供应控制器的作用。该@Controller
注释充当注解类刻板印象,这表明它的作用。
@Controller有什么特别之处?
您不能使用任何其他类似@Service
或切换此注释@Repository
,即使它们看起来相同。调度程序扫描带有注释的类,@Controller
并@RequestMapping
在其中检测注释。您只能@RequestMapping
在带@Controller
注释的类上使用。
@服务
@Services
在存储库层中保存业务逻辑和调用方法。
@Service有什么特别之处?
除了用来表明它保持业务逻辑这一事实外,该注释没有提供任何明显的专业知识,但是谁知道,spring将来可能会增加一些额外的例外。
@Service与@Controller
@Service:类是“业务服务门面”(按核心J2EE模式的意义)或类似的东西。
@Controller:指示带注释的类是“ Controller”(例如,Web控制器)。
----------查找有关主要刻板印象的有用笔记 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
指示带注释的类是组件。当使用基于注释的配置和类路径扫描时,此类将被视为自动检测的候选。
@interface控制器
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
指示带注释的类是“控制器”(例如,Web控制器)。
@接口服务
@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
指示带注释的类是“存储库”,最初由Domain-Driven Design(Evans,2003)定义为“一种封装存储,检索和搜索行为的机制,该机制模仿对象的集合”。实现诸如“数据访问对象”之类的传统J2EE模式的团队也可以将这种构造型应用于DAO类,尽管在这样做之前应注意理解数据访问对象与DDD样式存储库之间的区别。此注释是通用的刻板印象,各个团队可以缩小其语义并适当使用。
与PersistenceExceptionTranslationPostProcessor结合使用时,这样注释的类可以进行Spring DataAccessException转换。出于工具,方面等目的,还注释了带注释的类在整个应用程序体系结构中的作用。
从Spring 2.5开始,此注释还用作@Component的特殊化,允许通过类路径扫描自动检测实现类。
我已经在这里回答了类似的问题,这是链接
两者都没有。
@Service注释具有其他用途,而@Controller具有其他用途。实际上,Spring @ Component,@ Service,@ Repository和@Controller批注用于在Spring框架中使用类路径扫描进行自动bean检测,但这并不意味着所有功能都相同。@Service:表示带注释的类是业务层中的Service组件。
@Controller:带注释的类指示它是控制器组件,并且主要用于表示层。
从春季开始
如您所见,该类使用@Controller注释。就其本身而言,@ Controller并不能做很多事情。其主要目的是将此类识别为组件扫描的组件。因为HomeController带有@Controller注释,所以Spring的组件扫描会自动发现它,并在Spring应用程序上下文中将HomeController的实例创建为bean。
实际上,其他一些注解(包括@ Component,@ Service和@Repository)的作用类似于@Controller。您可以使用其他任何注释同样有效地对HomeController进行注释,并且仍然可以使用相同的注释。但是,@ Controller的选择更能说明该组件在应用程序中的角色。
您可以将@service声明为@Controller。
您不能将@Controller声明为@Service
@服务
这是正常的。您只是将类声明为组件。
@Controller
它比Component更特殊。该调度程序将搜索@RequestMapping这里。因此,用@Controller注释的类将另外被声明为可调用API的URL。