首页 > 代码库 > Spring自动注解装配、自动检测装配Bean配合过滤组件使用

Spring自动注解装配、自动检测装配Bean配合过滤组件使用

自动注解装配

当我们使用注解装配时,需要在XML文件中配置:

<context:annotation-config/>那么我们就可以使用基于注解的自动装配

Spring支持几种不同的自动注解装配

 

1.@Autowired :Spring会尝试使用byType的自动装配方式

例如:  @Autowired

    publicPeople(Language language) {

   

        this.language =language;

       

        language.say();

    }

@Autowired

    public setLanguage(Languagelanguage) {

   

        this.language =language;

       

        language.say();

    }

一般对于含有构造器的bean,直接对构造器注解,如果使用setter装配,直接对属性注解。

还可以直接对属性注解,那么此时就应删除setter方法。

在@Autowired的注解中,只能将一个bean装配到关联bean的属性中,如果存在多个bean或者不存在配对的bean,那么就会抛出异常。在Spring中分别对此提出了解决办法:

可选的自动装配

@Autowired表明所注解的属性,必须不能为空,但是使用它的required属性可以指定 @Autowired(required=false)表示所注解的属性可以为空

当使用同样的方法注解构造器时,只能有一个构造器的注解required为true,其它的为false。但是对于默认的@Autowired来说,会自动装配参数最多的构造器。

 

 

限定歧义的依赖

     当有多个bean满足要求时,可以结合@Qualifier注解来消除歧义。

   例如:@Autowired

           @Qualifier(“english”)

    public setLanguage(Languagelanguage) {

   

        this.language =language;

       

        language.say();

    }

那么在装配时,就会选择id为english的bean进行装配,此时就由byType变为byName的自动装配,将装配的范围缩小,已到达消除歧义的目的。

我们同样可以在English类中注解:@Qualifier(“stringed”)

或者在xml中配置<bean id=”language” class=”English”>

<qualifier  value=http://www.mamicode.com/”stringed”/>可以到达同样的效果。

2.@Inject

@Inject注入与@Autowired注入的使用方法一样,同样可以注解属性、方法、构造器,与@Autowired不同的是@Inject没有required属性,因此@Inject注解的依赖关系必须存在,否则就会抛出异常。

@Autowired注解会存在歧义,同样@Inject也会存在歧义,与@AutoWired搭配@Qualifier一样,@Inject搭配@Named使用可以消除歧义,它的作用、用法与@Qualifire一样,指定一个id名。

 

自动检测bean

我们通过使用<context:component-scan/>来代替<context:annotation-config/>,<context:component-scan/>不仅可以实现<context:annotation-config/>的功能,即消除property和constructor-arg的配置,它还可以自动检测盒装配bean,也就是我们可以不用使用bean元素。

使用该方法需要在XML文件中配置:

<context:component-scan base-package=”com.springinaction.springidol”/>

程序会自动扫描base-package,并且找出它标注的bean。

要使我们的程序能够自动检测bean,我们需要做的就是标注一个bean,使其能够被自动检测出来,最常用的就是@Componenet注解一个bean,例如标注一个People类为Spring bean  

@Component

pubic  class  People{…….}//该bean的id为people

我们还可以指定id

@Component(“p”)//该id为p

该过程就是:当程序运行时,通过扫描base-package包,会使被@componenet标注的类将其注册为Spring bean,然后行使<context:annotation-config/>的功能,即自动装配bean。

 

 

过滤组件扫描

在使用自动检测bean 的同时,我们还可以通过过滤组件来定义我们的扫描策略,通过为<context:component-config/>配置<context:include-filter/>和<context:exclude-filter/>来实现。这两个过滤组件的作用正好相反,<context:include-filter/>告知哪些类需要被注册,<context:exclude-filter/>告知哪些类不需要注册。

例如:

<context:component-scan>

<context:include-filter type=”assigable”expression=”com.springinaction.springidol.Instrument”/>

</context:component-scan>

type与expression的联合使用使继承Instrument的类注册为Spring bean。

type的取值:


Spring自动注解装配、自动检测装配Bean配合过滤组件使用