我正在学习Spring 3,我似乎没有掌握<context:annotation-config>和<context:component-scan>背后的功能。
从我读到的内容来看,它们似乎处理不同的注释(@Required, @Autowired等vs @Component, @Repository, @Service等),但从我读到的内容来看,它们注册了相同的bean后处理器类。
更让我困惑的是,在<context:component-scan>上有一个annotation-config属性。
有人能解释一下这些标签吗?什么是相似的,什么是不同的,是一个被另一个取代,它们互相完善,我需要其中一个吗,还是两个?
<context:annotation-config>
只解决@Autowired和@Qualifer注释,这就是所有的,它关于依赖注入,还有其他注释做同样的工作,我认为如何@Inject,但都是关于通过注释解决DI。
注意,即使声明了<context:annotation-config>元素,也必须声明类是Bean,记住我们有三个可用选项
XML: <憨豆先生>
@注解:@组件,@服务,@存储库,@控制器
JavaConfig: @Configuration, @Bean
现在有了
<context:component-scan>
它做了两件事:
它扫描带有注释的所有类
@组件、@服务、@存储库、@控制器和@配置并创建一个Bean
它与<context:annotation-config>所做的工作相同。
因此,如果你声明<context:component-scan>,就没有必要再声明<context:annotation-config>了。
Thats所有
例如,一个常见的场景是仅通过XML声明bean,并通过注释解析DI
<bean id="serviceBeanA" class="com.something.CarServiceImpl" />
<bean id="serviceBeanB" class="com.something.PersonServiceImpl" />
<bean id="repositoryBeanA" class="com.something.CarRepository" />
<bean id="repositoryBeanB" class="com.something.PersonRepository" />
我们只声明了bean,没有关于<constructor-arg>和<property>, DI是通过@Autowired在它们自己的类中配置的。这意味着服务对它们的存储库组件使用@Autowired,而存储库对JdbcTemplate、DataSource等组件使用@Autowired
<context:annotation-config>:扫描并激活spring config xml中已注册bean的注释。
<context:component-scan>: Bean注册+ <context:annotation-config>
@Autowired和@Required是目标属性级别,所以bean应该在使用这些注释之前在spring IOC中注册。要启用这些注释,要么必须注册各自的bean,要么包含<context:annotation-config />。例如,<context:annotation-config />仅适用于已注册的bean。
@Required启用RequiredAnnotationBeanPostProcessor处理工具
@Autowired启用AutowiredAnnotationBeanPostProcessor处理工具
注:注释本身没什么事,我们需要一个Processing Tool,它是底层的一个类,负责核心流程。
@Repository, @Service和@Controller是@Component,它们的目标是类级别。
<context:component-scan>它扫描包并找到并注册bean,它包括<context:annotation-config />所做的工作。
将XML迁移到注释
Spring允许您做两件事:
自动装配bean
自动发现bean
1. Autowiring
Usually in applicationContext.xml you define beans and other beans are wired using
constructor or setter methods. You can wire beans using XML or annotations.
In case you use annotations, you need to activate annotations and you have to add
<context:annotation-config /> in applicationContext.xml. This will simplify the
structure of the tag from applicationContext.xml, because you will not have to manually wire beans (constructor or setter). You can use @Autowire annotation and the beans will be wired by type.
避免手动XML配置的一个步骤是
2. Autodiscovery
Autodiscovery is simplifying the XML one step further, in the sense that you don't even need too add the <bean> tag in applicationContext.xml. You just mark the specific beans with one of the following annotation and Spring will automatically wire the marked beans and their dependencies into the Spring container. The annotations are as follow: @Controller, @Service, @Component, @Repository. By using <context:component-scan> and pointing the base package, Spring will auto-discover and wire the components into Spring container.
作为结论:
<context:annotation-config />被使用是为了能够使用
@ autowired注解
<context:component-scan />用于确定搜索
特定的bean和自动装配的尝试。