spring Bean自动装配
spring
满足bean
依赖的一种方式.spring
会在应用上下文中为某个bean
寻找其依赖的bean
.spring
自动装配需要从两个角度来实现,或者说是两个操作.
spring
会发现应用上下文中锁创建的bean
.spring
自动满足bean
之间的依赖,也就是通常所说的ioc/DI.
组件扫描和自动装配组合发挥巨大威力,使的显示的配置降低到最少。
具体实现步骤:
public class Cat {
//其余方法省略
public void shout() {
System.out.println("miao~");
}
}
public class Dog {
//其余方法省略
public void shout() {
System.out.println("wang~");
}
}
public class User {
private Cat cat;
private Dog dog;
private String str;
}
测试方式:
public class MyTest {
@Test
public void testMethodAutowire() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
user.getCat().shout();
user.getDog().shout();
}
}
结果正常输出,环境OK
第一步:在spring
配置文件中引入context文件头.
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
开启属性注解支持:
<context:annotation-config/>
@Autowired
是按类型自动转配的,不支持id
匹配。spring-aop
的包!set
方法去掉.使用@Autowired
注解public class User {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String str;
public Cat getCat() {
return cat;
}
public Dog getDog() {
return dog;
}
public String getStr() {
return str;
}
}
此时配置文件的内容:
<context:annotation-config/>
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"/>
@Autowired
是根据类型自动装配的,加上@Qualifier
则可以根据byName
的方式自动装配@Qualifier
不能单独使用。
测试实验步骤:
配置文件修改内容,保证类型存在对象。且名字不为类的默认名字!
<bean id="dog1" class="com.kuang.pojo.Dog"/>
<bean id="dog2" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
在属性上添加Qualifier
注解
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
@Autowired
@Qualifier(value = "dog2")
private Dog dog;
@Resource
@Resource
如有指定的name
属性,先按该属性进行byName
方式查找装配;byName
方式进行装配;byType
的方式自动装配。public class User {
//如果允许对象为null,设置required = false,默认为true
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String str;
}
beans.xml
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"/>
测试:结果OK
配置文件2:beans.xml , 删掉cat2
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
实体类上只保留注解
@Resource
private Cat cat;
@Resource
private Dog dog;
结果:OK
结论:先进行byName查找,失败;再进行byType查找,成功。
小结
@Autowired
与@Resource
异同:
@Autowired
与@Resource
都可以用来装配bean
。都可以写在字段上,或写在setter
方法上。
@Autowired
默认按类型装配(属于spring
规范),默认情况下必须要求依赖对象必须存在,如果要允许null
值,可以设置它的required
属性为false
,如:@Autowired(required=false)
,如果我们想使用名称装配可以结合@Qualifie
r注解进行使用
@Resource
(属于J2EE复返),默认按照名称进行装配,名称可以通过name
属性进行指定。如果没有指定name
属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter
方法上默认取属性名进行装配。 当找不到与名称匹配的bean
时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired
先byType
,@Resource
先byName
。