似乎有多个XML标签用于告诉Spring使用注释:
<context:annotation-config/>
<context:component-scan base-package="org.example" />
<mvc:annotation-driven />
<tx:annotation-driven transaction-manager="transactionManager" />
我认为第一个标签表示要扫描注释,第二个标签表示要扫描哪个包(并且可选地,可以排除/包括要搜索的内容)。然后可能第三个人说扫描控制器类。最后一个扫描数据访问注释。
我的问题理解是:
有人能告诉我每个标签的功能,以及为什么它们不是多余的?如果有任何其他注释XML标记,请告诉我。
经过进一步调查,我相信我找到了一些额外的信息:
<context:annotation-config/>
标签允许您对变量,构造函数和方法使用注释(例如@Autowired,@ Resource等)。<context:component-scan base-package="org.example" />
标签允许您在类上使用注释(例如@ Repository,@ Controller等)。<tx:annotation-driven transaction-manager="transactionManager" />
标记实际上启用 @Transactional标记(<context:annotation-config/>
标记允许@Transactional标记,但它没有执行任何东西)。 <mvc:annotation-driven />
仍然不完全确定。我想也许它会增加对JSON等的进一步支持。
答案 0 :(得分:2)
annotation-config
和component-scan
a)<context:annotation-config/>
仅查找在定义它的同一应用程序上下文中的bean上的注释。这意味着,如果将<context:annotation-config/>
放入DispatcherServlet的WebApplicationContext中,它只会检查控制器中的@Autowired bean,而不检查您的服务。有关详细信息,请参阅第15.2, “The DispatcherServlet”节。
b)Spring提供了自动检测“原型”类并使用ApplicationContext注册相应BeanDefinition的功能。要自动检测这些类并注册相应的bean,需要在XML中包含component-scan
元素,其中'basePackage'将是一个公共父包(或者可以指定包含每个包的父包的逗号分隔列表)类)。
tx:annotation-driven
您确实直接在元素中提供了事务管理器实例。 annotation-config
和component-scan
不会。
mvc:annotation-driven
此标记注册Spring MVC将请求分派给@Controllers所需的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter bean。标签根据类路径中的内容配置具有合理默认值的那两个bean。阅读更多Spring doc。
答案 1 :(得分:1)
我认为标签1和标签2可以组合成一个标签。所以我不知道为什么他们分开了。
出于向后兼容的原因。旧的Spring应用程序必须继续工作,并且合并标记(在不同版本的Spring中引入)会通过更改默认行为来破坏它。
标签3和4似乎是1和2的冗余。
见上文。 4个标签略有不同,但是互补的东西。是的,如果Spring是从头开始设计的,那么它们就会更少,但功能需要保持独立。
总结:
<context:annotation-config/>
在上下文中启用注释支持。这是作为Java 5支持的一部分添加的,当时Spring仍然支持Java 1.4
<context:component-scan base-package="org.example" />
支持自动扫描和配置bean,而不是使用显式声明。这是在Spring 2.5中添加的。
<mvc:annotation-driven />
是一个奇怪的。为了支持带注释的控制器(默认情况下工作),不需要它。它的作用是实际禁用旧样式的非注释控制器,以及添加对JSON之类的东西的支持。这是必需的,因为较旧的应用仍然使用较旧的控制器样式。
<tx:annotation-driven>
是必需的,因为Spring支持许多不同类型的事务划分,其中一种是注释样式。这是最受欢迎的风格,但绝不是唯一的风格。