最小化spring XML配置,Spring提供了4种自动装配策略。

时间:2022-04-01 04:21:33

1.ByName自动装配:匹配属性的名字

在配置文件中的写法:

<bean name="course" class="course类的全包名"></bean>

<bean name="student" class="student类的全包名" autowire="byName"></bean>

注:spring会发现course属性可以通过setter注入来进行自动装配。

在ByName中注入可以省略一下的设置:<property name="stuName" value="张三"></property>

2.byType自动装配:是检查属性的类型

<bean name="course2" class="类的全包名" primary="true"></bean>

<bean name="course3" class="类的全包名" primary="false"  autowire-candidate=false></bean>

<bean name="student" class="类的全包名" autowire="byType"></bean>

注:spring会发现course属性可以通过setter注入来进行自动装配。

autowire="byType":设置byType自动装配

primary="true":在多个类型的bean中,以有此设置的为主。

 autowire-candidate=false:在多个类型的bean中,以有此设置排除某些Bean

3.constructor自动装配

<bean name="course" class="course类的全包名"></bean>

<bean name="student" class="student类的全包名" autowire="constructor"></bean>

注:spring会发现course属性可以通过构造函数注入来进行自动装配。

4.默认自动装配:

在命名空间(就是最上面的xml里面)中对注入进行定义,则这个配置文件默认都会采用这个方式进行装配

 

5.混合使用自动装配和显示装配

对某个Bean选择了自动装配策略,并不代表不能对该Bean的其他属性进行显示装配。

例如:

<bean id="" class="" autowire="byType">

<property name="" ref="" />

</bean>

即采用了ByName也采用了ByType

6.使用注解装配:@Autowired(重点)

默认情况下,@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。如果没有Bean可以装配到@Autowired所标注的属性或参数中,自动装配就会失败并会抛出NullPointException异常。

属性不一定非要装配,null值也是可以接受的。可以通过设置@Autowired的required属性为false来配置自动装配是可选的。

@Autowired(required=false)

private Object obj;

注意:required属性可以用于@Autowired注解所使用的任何地方。但是当使用构造器装配时,只有一个构造器可以将@Autowired的required属性设置为true。其他使用@Autowired注解所标注的构造器只能将required属性设置为false。

  1. 限定歧义性的依赖

另一方面,问题或许在于spring并不缺少适合自动装配的Bean。可能会有足够多的Bean都完全满足装配条件,并且都可以被装配到属性或参数中。

为了帮助@Autowired鉴别出哪一个Bean才是我们所需要的,可以配合使用spring的@qualifier注解。

例如:为了确保spring为Bean选择吉他(guitar)来演奏,即使有其他Bean也可以装配到instrument属性中,但可以使用@qualifier来明确指定名为guitar的Bean。

@Autowired

@qualifier("quitar")

private Instrument instrument;

@qualifier注解将尝试注入ID为guitar的Bean。