简单总结@Autowired和@Resource区别
@Autowired
创建Cat类和Dog类的代码省略
public class Person {
public String name;
@Autowired
public Dog dog;
@Autowired
public Cat cat;
public String getName() {
return name;
}
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
}
<?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/>
<bean id="dog" class="com.jiehao.pojo.Dog"/>
<bean id="cat" class="com.jiehao.pojo.Cat"/>
<bean id="person" class="com.jiehao.pojo.Person"/>
</beans>
使用了@Autowired可以不用写set方法,前提是这个自动装配的属性在IOC(Spring)容器中存在,且符合byname条件
@Qualifier
public class Person {
@Nullable
public String name;
@Autowired
@Qualifier(value = "dog1")
public Dog dog;
@Autowired
@Qualifier(value = "cat1")
public Cat cat;
public String getName() {
return name;
}
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
}
<?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/>
<bean id="dog1" class="com.jiehao.pojo.Dog"/>
<bean id="dog" class="com.jiehao.pojo.Dog"/>
<bean id="cat1" class="com.jiehao.pojo.Cat"/>
<bean id="cat" class="com.jiehao.pojo.Cat"/>
<bean id="person" class="com.jiehao.pojo.Person"/>
</beans>
@Autowired首先会按照类型查找,当多个想同类型时会使用 @Qualifier指定id查找
@Resource
使用前需要添加依赖,导包
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
public class Person {
public String name;
//如果没有指定name = "dog2",就会直接匹配dog
@Resource(name = "dog2")
public Dog dog;
@Resource(name = "cat2")
public Cat cat;
public String getName() {
return name;
}
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
}
<?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/>
<bean id="dog" class="com.jiehao.pojo.Dog"/>
<bean id="dog2" class="com.jiehao.pojo.Dog"/>
<bean id="cat" class="com.jiehao.pojo.Cat"/>
<bean id="cat2" class="com.jiehao.pojo.Cat"/>
<bean id="person" class="com.jiehao.pojo.Person"/>
</beans>
小结;
相同点:
都是用来自动装配,都可放在属性上
不同点:
@Autowired
spring默认按类型注入 (如果要使用名称装配,配合@Qualifier注解)
如果存在且唯一,就完事。
注意:依赖对象必须存在,如果要允许null值,可以设置它的required属性为false @Autowired(required=false);
如果存在但不唯一,寻找name为的bean。因为bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了
@Resource
- 默认按名称进行注入,通过name属性指定对应bean的Id或者name
- 如果找不到名称,就通过类型查找
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常