一、综述@AutoWired和@Resource
共 同 点 :
-
都可以实现自动注入的功能。在对于仅有唯一实现类的接口或者直接注入类的实例而言,具有相同的效果。
区 别 点 :
-
@Autowired是基于Spring规范开发,在实现注入功能的时候是基于By type的方式去注入
-
@Resource是基于Java的规范开发,在实现注入功能的时候是基于By name的方式来注入
By name :根据被注解的属性的name,在Spring容器中查找相同名字的bean
By type :根据被注解的属性的class,在容器中查找相同class的bean
二、案例讲解
-
案例一
定义父接口Human.java,以及一个实现类Man.java。在测试类中通过@Autowired和@Resource自动注入Human的实例
-
案例二
在案例一的基础上增加一个实现类Woman.java。再分别测试。
-
案例三
在案例二的基础上测试@Primary,@Qualifie注解的作用
案例一:
-
定义基本类
【Human.java】
public interface Human {
void say();
}
【Man.java】
@Component
public class Man implements Human {
@Override
public void say() {
System.out.println("I am boy");
}
}
-
定义测试类
@Service
public class ScheduleTest implements ApplicationRunner {
@Autowired
private Human auto;
@Resource
private Human resource;
@Override
public void run(ApplicationArguments args) throws Exception {
auto.say();
resource.say();
}
}
测试结果:正常
案例二:
定义基本类
【Woman.java】
@Component
public class Man implements Human {
@Override
public void say() {
System.out.println("I am girl");
}
}
测试结果:
@Autowired
Field human in com.bean.ScheduleTest required a single bean, but 2 were found:- man: defined in file [C:\Users\zhangqiang\IdeaProjects\autoInject\target\classes\com\bean\Man.class]- woman: defined in file [C:\Users\zhangqiang\IdeaProjects\autoInject\target\classes\com\bean\Woman.class]
@Resource
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.bean.Human' available: expected single matching bean but found 2: man,woman
测试案例三:
1、@Primary应用
【Human.java】
@Component
@Primary //该注解确保该类优先
public interface Human {
void say();
}
@Primary //该注解确保该类优先
测试结果:正常
2、@Qualifier("man")
@Autowired
@Qualifier("man")
private Human auto;
@Resource
@Qualifier("woman")
private Human resource;
定义按照指定的name在容器中进行查找,根据注册的name进行匹配
测试结果:正常
3、@Resource("man")
同样是By name 的方式查找注册名为 man 的实例
@Resource("man")
private Human human;
测试结果:正常