Bean的自动装配
- 自动装配是Spring满足Bean依赖 的一种方式!
- Spring会在上下文中自动寻找,并自动给Bean装配
在Spring中Bean的三种装配方式
- 在xml中显示的装配
- 在Java中显示装配
- 隐式的自动装配Bean(重要方式)
测试
-
环境搭建
-
XML方式实现装配
-
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.liu.pojo.Cat"/> <bean id="dog" class="com.liu.pojo.Dog"/> <bean id="people" class="com.liu.pojo.People"> <property name="name" value="就是我啊"/> <property name="dog" ref="dog"/> <property name="cat" ref="cat"/> </bean> </beans>
-
一个人有两个宠物!People类
package com.liu.pojo; public class People { private Cat cat; private Dog dog; private String 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; } @Override public String toString() { return "People{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + '\'' + '}'; } }
- 测试是否可以获取到宠物,并执行叫声方法
@Test public void test1() { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); People people = context.getBean("people", People.class); people.getDog().shout(); people.getCat().shout(); }
-
-
byName 自动装配方式
-
<bean id="cat" class="com.liu.pojo.Cat"/> <bean id="dog" class="com.liu.pojo.Dog"/> <bean id="people" class="com.liu.pojo.People" autowire="byName"> <property name="name" value="就是我啊"/> </bean>
-
byName:会自动在容器 上下文中查找,和自己对象set方法后面的值对应的Bean Id!
-
需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的小写值一致
-
-
byType方式 自动装配
-
<bean id="cat" class="com.liu.pojo.Cat"/> <bean id="dog111" class="com.liu.pojo.Dog"/> <bean id="people" class="com.liu.pojo.People" autowire="byType"> <property name="name" value="就是我啊"/> </bean>
-
byType:会自动在容器 上下文中查找,和自己对象属性类型(Class)相同的Bean
-
需要保证属性类型唯一
-
使用注解实现自动装配
JDK 1.5支持的注解,Spring2.5就支持注解了
要使用注解须知:
- 导入约束
- 配置注解支持
- People使用注解方式注入
使用Autowired注解时,可以不需要set方法,前提是你这个自动装配的属性在IOC容器中存在,且符合名字byName,因为注解是使用反射来实现的,可以不需要set方法。
注意:
@Nullable 字段标记了这个注解,说明这个字段可以为null
@Autowired(required =false) 如果显示定义了Autowired的required属性为false,说明这个对象可以为null,默,默认为true,不允许为空
@Qualifier(value="") 如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个@Autowired完成的时候,可以使用@Qualifier(value=“xxx”)去配置@Autowired的 使用,指定一个唯一的bean对象注入!
- @Resource注解
同样可以实现自动装配,前提是bean的id与属性值匹配,否则指定Resource的name属性标识选择的bean
@Resource 和@Autowired的比较
- 都是用来自动装配的
- 都可以放在属性字段上
- @Autowired 通过byType的方式实现
- @Rescource 默认是通过byName方式实现,如果找不到 名字,则通过byType实现!如果两个都找不到的情况下,就报错!
- 执行顺序不同:@Autowired 通过byType的方式实现的,@Resource默认通过byName的方式实现的。