@Resource和@Autowired区别

前言:

@Resource和@Autowired都是做bean的注入时使用

历史:  @Autowired     属于Spring的注解           org.springframework.beans.factory.annotation.Autowired

     @Resource     不属于Spring的注解,JDK1.6支持的注解    javax.annotation.Resource

共同点:装配bean。写在字段上或写在setter方法

不同点:@Autowired  默认按类型装配   

          依赖对象必须存在,如果要允许null值,可以设置它的required属性为false   @Autowired(required=false)

          也可以使用名称装配,配合@Qualifier注解

    @Resource  默认按名称进行装配,通过name属性进行指定

 

举个栗子:

新建一个接口BaseService,两个实现类AServiceImpl、BServiceImpl

public interface BaseService {
    
    void print();

}
@Service
public class AServiceImpl implements BaseService {

    @Override
    public void print() {
        System.out.println("aaa");
    }

}
@Service
public class BServiceImpl implements BaseService {

    @Override
    public void print() {
        System.out.println("bbb");
    }

}

再建一个测试类:

/**
 * 测试@Resource与@Autowired注入的区别
 * 
 * @author xuwenjin
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = App.class)
public class TestSet {
    
    @Autowired
    private BaseService service;
    
    @Test
    public void test(){
        String className = service.getClass().getName();
        System.out.println(className);
        service.print();
    }

}

执行test方法,报错,结果如下:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xwj.service.BaseService' available: expected single matching bean but found 2: AServiceImpl,BServiceImpl

在@Autowired下增加@Qualifier注解

    @Autowired
    @Qualifier("AServiceImpl")
    private BaseService service;

再执行test方法,成功,结果如下:

com.xwj.service.AServiceImpl
aaa

 

再来试试 @Resource 注解

  @Resource
    private BaseService service;

执行test方法,报错异常跟只用@Autowired情况一样。再加上name属性:

    @Resource(name = "AServiceImpl")
    private BaseService service;

再执行test方法,成功。

 

总结:

  一个接口,多个实现类,Autowired就不知道注入哪一个实现类,而Resource有name属性,可以区分。

  参考资料:https://www.zhihu.com/question/39356740

 

posted @ 2018-04-18 20:47  仅此而已-远方  阅读(911)  评论(1编辑  收藏  举报