依赖注入的本质是装配,装配是依赖注入的具体行为
-
spring会在上下文中自动寻找,并自动给bean装配属性
-
自动装配的三种方式
(1).在xml中显式的装配
(2).在java中显式的装配
(3).隐式的自动装配bean
这里主要讲第三种
1.测试环境搭建
public class Cat {
public void bark(){
System.out.println("miao...");
}
}
public class Dog {
public void bark(){
System.out.println("wang...");
}
}
public class People {
Cat cat;
Dog dog;
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;
}
}
2.byName:会自动在容器上下文中,通过set方法中的参数名去查找相同id的<bean>
<bean id="dog" class="com.guan.bean.Dog"></bean>
<bean id="cat" class="com.guan.bean.Cat"></bean>
<bean id="people" class="com.guan.bean.People" autowire="byName"></bean>
3.byType:会自动在容器上下文中,通过自己对象属性类型相同的bean
<bean id="dog" class="com.guan.bean.Dog"></bean>
<bean id="cat" class="com.guan.bean.Cat"></bean>
<bean id="people" class="com.guan.bean.People" autowire="byType"></bean>
注意
- byName需要保证
<bean>
的id唯一 - byType需要保证
<bean>
的type唯一
4.使用注解实现自动装配
使用:
-
导入约束
-
配置注解的支持
<?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:annotation-config/> </beans>
常用注解:
-
@Autowired:需要配置spring,直接在属性上使用.先使用byType,再使用byName?
required(default true):默认不需Null
public class People { @Autowired Cat cat; @Autowired Dog dog; }
@Qualifier:当属性名和容器中
<bean>
中的id不同时,可以通过该注解为属性"起别名"public class People { @Autowired @Qualifier("cat12") Cat cat; @Autowired Dog dog; }
-
@Resource:jdk注解
name:用于起别名
区别:
-
实现方式:
(1).@Autoword先通过byType实现,如果有重复再通过byName,而且默认要求对象存在
表现:同一个类型,不同名称,
<bean id="dog123" class="com.guan.bean.Dog"></bean>
,可以匹配;同一个名称,类型不匹配时,<bean id="dog" class="com.guan.bean.Cat"></bean>
,如果只要一个对应的类型可以自动匹配,如果有多个对应的类型会报错(2).@Resource默认通过byName实现,如果找不到name,才通过byType,否则报错
表现:如果有一个同名的不同类型
<bean id="cat" class="com.guan.bean.Dog"></bean>
,会直接报错对应的类型不匹配;如果有一个同类型的,但是不同名的,可以匹配;如果有多个同类型且不同名,无法匹配
总结:实际上xml文件中一般存放的核心配置文件,一般的配置可以用其它方式