关于@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>
技术分享

以上是关于关于@Autowired和<context:component-scan base-package="" />的一些认识的主要内容,如果未能解决你的问题,请参考以下文章

@Autowired和@Resource装配

java-普通类文件@Autowired自动注入为null

annotation中的Autowired

为什么@Autowired不能一直工作?

spring中的annotation注解类配置

具有休眠 CRUD 操作的 Spring 3 注释:@Autowired 未按预期工作