6、引用类型的自动装配 和 使用注解实现自动装配
一、Bean的自动装配(AutoWired):
- 自动装配是Spring满足bean依赖一种方式!
- Spring会在上下文中自动寻找,并自动给bean装配属性!
在Spring中有三种装配的方式
- 在xmI中显示的配置(前面的博客都是用的这种)
- 在java中显示配置
- 隐式的自动装配bean [重要 ! ]
1、配置环境
一个人有两个宠物!
pojo实体类:
public class Cat { public void call(){ System.out.println("猫在叫~"); } }
public class Dog { public void call(){ System.out.println("狗在叫~"); } }
public class Person { private Cat cat; private Dog dog; private String name; @Override public String toString() { return "Person{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + '\'' + '}'; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
beans.xml
<bean id="cat" class="com.zhixi.pojo.Cat"/> <bean id="dog" class="com.zhixi.pojo.Dog"/> <bean id="person" class="com.zhixi.pojo.Person"> <property name="name" value="张志喜"/> <property name="cat" ref="cat"/> <property name="dog" ref="dog"/> </bean>
测试文件:
@Test public void test1(){ ApplicationContext context = new ClassPathXmlApplicationContext("bens.xml"); Person person = (Person) context.getBean("person"); person.getCat().call(); person.getDog().call(); }
猫在叫~
狗在叫~
2、aotowire属性
byName:
<bean id="cat" class="com.zhixi.pojo.Cat"/> <bean id="dog" class="com.zhixi.pojo.Dog"/> <!-- byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid! --> <bean id="person" class="com.zhixi.pojo.Person" autowire="byName"> <property name="name" value="张志喜"/> </bean>
byType:
<!--即使没有设置id属性,通过byType也能够找到对应的bean--> <bean class="com.zhixi.pojo.Cat"/> <bean class="com.zhixi.pojo.Dog"/> <!-- byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean! --> <bean id="person" class="com.zhixi.pojo.Person" autowire="byType"> <property name="name" value="张志喜"/> </bean>
小结:
byName:java类中的引用类型名称(Cat cat)跟bean的id是一样的 <bean id="cat"> spring能够赋值给引用类型。 bytype:java类中引用类型的数据类型和spring容器中(配置文件),<bean>的class属性是同源关系的,这样的bean能够赋值给引用类型 同源: 1. java类中引用类型的数据类型和bean的class的值是一样的。 2. java类中引用类型的数据类型和bean的class的值父子类关系的。 3. java类中引用类型的数据类型和bean的class的值接口和实现类关系的
二、注解实现自动装配
使用须知:不需要再xml文件中再进行配置bea了、
1、导入约束
2、配置注解的支持:<context:annotation-config/>
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包,说明在这个包下的注解会被识别-->
<context:component-scan base-package="com.zhixi.pojo"/>
<context:annotation-config/> </beans>
注解的使用:
@AutoWired
加到属性上面,也可以加到setter方法,或者直接加到属性上甚至set方法可以不要了、
public class Person { @Autowired private Cat cat; @Autowired private Dog dog; private String name; @Override public String toString() { return "Person{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + '\'' + '}'; } }
@Qualifier
如果@Autowired自动装配的环境比较复杂【比如多个bean对象】,自动装配无法通过一个注解[@Autowired] 完成的时候、我们可以
使用@Qualifier(value="xx")去配置@Autowired的使用,指定一个唯一 的bean对象注入!
xml文件:
<bean id="dog" class="com.zhixi.pojo.Dog"/> <bean id="dog2" class="com.zhixi.pojo.Dog"/>
pojo实体类:
@Autowired
@Qualifier(value = "dog2")
private Dog dog;
@Resouece
@Resource(name = "dog2")
private Dog dog;
小结:
@AutoWired和@Resource 的区别:
- 都是用来自动装配的,都可以放在属性字段上
- @ Autowired 通过byType的方式实现,而且必须要求这个对象存在! [常用]
- @ Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现! 如果两个都找不到的情况下,就报错! [常用]