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。
- 限定歧义性的依赖
另一方面,问题或许在于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。