关于@Autowired和<context:component-scan base-package="" />的一些认识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于@Autowired和<context:component-scan base-package="" />的一些认识相关的知识,希望对你有一定的参考价值。
参考技术A 要使用<context:component-scan>标签, 必须要有xmlns:context配置<context:component-scan base-package="" />扫描的包及其子包,只有当遇到了@Component @Controller@Service这些注解时spring才会注册对应的bean,配置扫描多个包,可以通过“,”逗号隔开:
<context:component-scan base-package="com.test1,com.test2,com.test3" />
另外<context:component-scan>有一个use-default-filters属性和两个子标签 <context:include-filter>,<context:exclude-filter>。 use-default-filters属性是使用默认过滤器,默认值为true,首先通过exclude-filter 进行黑名单过滤;然后通过include-filter 进行白名单过滤;否则默认选中扫描。(true则会对除了黑名单外进行扫描管理,false则不使用默认过滤器)。
在Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 省去了set ,get方法。
当spring容器中有bean之后,就能使用@autowired自动注入相对应的bean了,这是因为在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor这样的bean,当这个bean扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该注解标注的变量或方法及构造函数的参数。
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
也就是说,如果你不配置扫描也不写@Controller@Service这些注解时,你必须手动在spring配置文件中配置bean,才能使用@Autowied注入bean。
此外在使用@Autowired时,首先在容器中查询对应类型的bean
1.如果查询结果刚好为一个,就将该bean装配给@Autowired指定的变量。
2.如果查询的结果不止一个,那么@Autowired会根据指定变量的名称来查找。也可以使用注解@Qualifier("bean的名称")来指定查找的bean。
3.如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false。
当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。
@Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,程序不会报错。
关于Spring中的<context:annotation-config/>配置
转发自:http://www.cnblogs.com/iuranus/archive/2012/07/19/2599084.html
当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如:
使用@Autowired注解,必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor的Bean:
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>
使用 @Required注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
类似地,使用@Resource、@PostConstruct、@PreDestroy等注解就必须声明 CommonAnnotationBeanPostProcessor;使用@PersistenceContext注解,就必须声明 PersistenceAnnotationBeanPostProcessor的Bean。
这样的声明未免太不优雅,而Spring为我们提供了一种极为方便注册这些BeanPostProcessor的方式,即使用<context:annotation- config/>隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor以及PersistenceAnnotationBeanPostProcessor这4个BeanPostProcessor。如下:
<context:annotation-config/>
另,在我们使用注解时一般都会配置扫描包路径选项:
<context:component-scan base-package="pack.pack"/>
该配置项其实也包含了自动注入上述processor的功能,因此当使用<context:component-scan/>后,即可将<context:annotation-config/>省去。
备注:
在配置文件中使用 context 命名空间之前,必须在 <beans> 元素中声明 context 命名空间。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
...
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
...
<context:annotation-config/>
</beans>