bean的自动装配
搭建环境:一个人有两只宠物
public class Dog {
public void shout(){
System.out.println("汪汪汪~~~");
}
}
public class Cat {
public void shout(){
System.out.println("喵喵喵~~~");
}
}
public class Person {
private String name;
private Dog dog;
private Cat cat;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", dog=" + dog +
", cat=" + cat +
'}';
}
}
使用set注入的方式应该是这样
<bean id="cat" class="com.liu.pojo.Cat"/>
<bean id="dog" class="com.liu.pojo.Dog"/>
<bean id="person" class="com.liu.pojo.Person">
<property name="name" value="大寻"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
测试
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = context.getBean("person", Person.class);
person.getCat().shout();
person.getDog().shout();
}
}
没问题可以正常运行
byName自动装配
- 把配置文件中代码改了
<bean id="cat" class="com.liu.pojo.Cat"/>
<bean id="dog" class="com.liu.pojo.Dog"/>
<bean id="person" class="com.liu.pojo.Person" autowire="byName">
<property name="name" value="大寻"/>
</bean>
这时后并没有注入dog和cat,只是把bean中添加了一个autowire=“byName”,代码依旧可以正常执行
byName:根据实例变量名称自动装载,按照类中声明的实例变量的名称,与XML配置文件中声明的bean定义的id的值进行匹配,相匹配的bean定义将被自动绑定到当前实例变量上。
这种方式的弊端就是:如果把bean中的id改成其他名字,就无法成功匹配,从而报错
byType自动装配
<bean id="cat" class="com.liu.pojo.Cat"/>
<bean id="dog" class="com.liu.pojo.Dog"/>
<bean id="person" class="com.liu.pojo.Person" autowire="byType">
<property name="name" value="大寻"/>
</bean>
把byName改为byType:仍然可以成功执行
byType:根据实例变量类型自动装载,按照类中声明的实例变量的类型,找到变量类型相同的bean的定义,找到之后自动绑定
这种方式可以直接把bean中的id元素省略,因为只会去匹配类型
弊端:这种方式必须保证匹配的类型全局唯一,如果bean中配置有两个Dog类型,会直接报错
使用注解自动装配(jdk1.5;spring2.5之后开始支持)
- 修改配置文件:导入context约束;配置注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
<bean id="cat" class="com.liu.pojo.Cat"/>
<bean id="dog" class="com.liu.pojo.Dog"/>
<bean id="person" class="com.liu.pojo.Person"/>
@Autowired
- 修改之后注入只需要在属性上添加一个
@Autowired
注解即可 - 在set方法上面添加注解也可
- 甚至可以不用写set方法也可以,前提是属性要在bean中注入
如果显示的定义了
@Autowired
中的require
属性值为true
说明这个属性值可以为null,否则不行
@resource
@resource
注解和@Autowired
使用方法差不多,如果bean中配置有多个属性,可以在@resource
中指定属性name="XXX"
@resource
注解和@Autowired
区别:
- 都是用来自动装配的,都可以放在属性字段上
@Autowired
通过byType的方式实现
而且必须要求这个对象存在! [常用]
使用@Qualifier(value="x")
去配合@Autowired
的使用,指定一个唯一的bean对象注入!@Resource
默认通过byname的方式实现,
如果找不到名字,则通过byType实现!
如果两个都找不到的情况下,就报错! [常用]- 执行顺序不同:
@Autowired
通过byType的方式实现。
@Resource
默认通过byname的方式实现。|