Autowire--- spring 自动装配
-
自动装配是Spring满足bean依赖的一种方式
-
Spring 会在上下文中自动寻找,并自动给bean装配属性
spring三种装配方式:
-
在xml中显示装配
-
在Java中显示装配
-
public class Cat {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void shout(){
System.out.println("miao");
}
}
//===================
@Component
@Scope(value = "singelton")
public class People {
private String name;
// @Autowired
// @Qualifier(value = "cat1")
@Resource(name = "cat1")
private Cat cat;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public People(String name, Cat cat) {
this.name = name;
this.cat = cat;
}
public People() {
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", cat=" + cat +
'}';
}
}
配置文件:byName/byType
<bean id="cat" class="com.wpz.Cat"></bean> <!-- <bean id="cat11" class="Cat"></bean>--> <bean id="people" class="com.wpz.People" autowire="byName"> <property name="name" value="wpz"/> </bean>
配置文件(使用注解):
需要增加context约束
<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" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" 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.wpz.pojo"/> <!-- 开启支持--> <context:annotation-config/> <bean id="cat0" class="com.wpz.Cat"></bean> <bean id="cat1" class="com.wpz.Cat"></bean> <!-- <bean id="cat11" class="Cat"></bean>--> <bean id="people" class="com.wpz.People"></bean>
测试类
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people = context.getBean("people", People.class);
people.getCat().shout();
}
autowire byName(按名称自动装配)
较之手动装配更加简单、快速、准确
关键配置:<bean id="people" class="com.wpz.People" autowire="byName">
原理:byName查找时,将类中的setCat()方法,转化成cat,再去容器中查找匹配是否有id为cat的对象;有则注入,无则报出空指针异常。
autowire byType(按类型自动装配)
需要保证同一类型的对象,在容器中是唯一的。否则报不唯一异常(NoUniqueBeanDefinitionException).下面代码编辑时自动提示错误了。
<bean id="cat1" class="com.wpz.Cat"></bean> <bean id="cat2" class="com.wpz.Cat"></bean> <!-- <bean id="cat11" class="Cat"></bean>--> <bean id="people" class="com.wpz.People" autowire="byType"> <property name="name" value="wpz"/> </bean>
注解:
@Autowired
-
直接在属性上使用,可以忽略set方法(前提是自动装配的属性在IOC容器中存在,且符合名字byName)
-
或者set方法上使用
- 需要导入spring-aop的包
- @Autowired 是按类型自动装配的,不支持id匹配
@Autowired(required = false) 对象可以为空
@Autowired(required = false) private Cat cat;
@Qualifier
- Autowire是根据类型自动装配的,加上Qualifier可以根据byname的方式自动装配
- Qualifier不能单独使用
<bean id="cat0" class="com.wpz.pojo.Cat"></bean> <bean id="cat1" class="com.wpz.pojo.Cat"></bean> //============= @Autowired @Qualifier(value = "cat1")//指定唯一bean private Cat cat;
@Resource
- 如果有指定的name属性,先按该属性进行byname方式的查询
- 其次在进行默认的byname方式匹配
- 如果以上都不成功,则按bytype方式装配
- 再不成功,则异常
<bean id="cat0" class="com.wpz.Cat" scope="singleton"></bean>
<bean id="cat1" class="com.wpz.Cat"></bean>
//====================
@Resource(name = "cat1") private Cat cat;
上面代码如果去掉(name="cat1")就会异常
总结:@resouce 和@Autowired 的区别
-
都是用来自动装配的,都可以放在属性字段上,或者setter方法上
-
Autowired通过byType事项,且必须要求这个对象存在
-
resouce 默认通过byName实现,如果找不到名字,则byType实现!如果都找不到,就报错!