一、Bean的自动装配(AutoWired):
自动装配是Spring满足bean依赖一种方式!
Spring会在上下文中自动寻找,并自动给bean装配属性!
在Spring中有三种装配的方式
在xmI中显示的配置(前面的博客都是用的这种)
在java中显示配置
隐式的自动装配bean [重要 ! ]
1、配置环境
一个人有两个宠物!
pojo实体类:
public classCat {public voidcall(){
System.out.println("猫在叫~");
}
}
public classDog {public voidcall(){
System.out.println("狗在叫~");
}
}
public classPerson {privateCat cat;privateDog dog;privateString name;
@OverridepublicString toString() {return "Person{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}publicCat getCat() {returncat;
}public voidsetCat(Cat cat) {this.cat =cat;
}publicDog getDog() {returndog;
}public voidsetDog(Dog dog) {this.dog =dog;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}
}
beans.xml
测试文件:
@Testpublic voidtest1(){
ApplicationContext context= new ClassPathXmlApplicationContext("bens.xml");
Person person= (Person) context.getBean("person");
person.getCat().call();
person.getDog().call();
}
猫在叫~
狗在叫~
2、aotowire属性
byName:
byType:
小结:
byName:java类中的引用类型名称(Cat cat)跟bean的id是一样的 spring能够赋值给引用类型。
bytype:java类中引用类型的数据类型和spring容器中(配置文件),的class属性是同源关系的,这样的bean能够赋值给引用类型
同源: 1. java类中引用类型的数据类型和bean的class的值是一样的。
2. java类中引用类型的数据类型和bean的class的值父子类关系的。
3. java类中引用类型的数据类型和bean的class的值接口和实现类关系的
二、注解实现自动装配
使用须知:不需要再xml文件中再进行配置bea了、
1、导入约束
2、配置注解的支持:
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
注解的使用:
@AutoWired
加到属性上面,也可以加到setter方法,或者直接加到属性上甚至set方法可以不要了、
public classPerson {
@AutowiredprivateCat cat;
@AutowiredprivateDog dog;privateString name;
@OverridepublicString toString() {return "Person{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}
}
@Qualifier
如果@Autowired自动装配的环境比较复杂【比如多个bean对象】,自动装配无法通过一个注解[@Autowired] 完成的时候、我们可以
使用@Qualifier(value="xx")去配置@Autowired的使用,指定一个唯一 的bean对象注入!
xml文件:
pojo实体类:
@Autowired@Qualifier(value="dog2")privateDogdog;
@Resouece
@Resource(name = "dog2")
private Dog dog;
小结:
@AutoWired和@Resource 的区别:
都是用来自动装配的,都可以放在属性字段上
@ Autowired 通过byType的方式实现,而且必须要求这个对象存在! [常用]
@ Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现! 如果两个都找不到的情况下,就报错! [常用]