Springboot注解@AutoWired和@Resource

一、综述@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;

测试结果:正常

你可能感兴趣的:(springboot)