[spring学习]8、@Autowired和@Resource的区别

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 [spring学习]8、@Autowired和@Resource的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

前言

@Autowired和@Resource的区别

@Autowired

规则

验证单个类型

验证多个类型

使用@Qualifier指定id

特别说明 

 @Resource

规则

通过name或type进行注入

name和type都不进行指定

总结


前言

        在基于注解配置bean中,我们可以通过@AutoWired和@Resource进行自动注入,但是二者也有些区别,下面就来说明一下二者的基本用法和区别


@Autowired和@Resource的区别

  • @Autowired不能指定id进行注入,要指定id进行注入还要使用@Qualifier进行配合才行。而@Resource可以通过name指定id
  • @Autowired的注入顺序是先byType,再byName。@Resource不指定name和type,那么就是先byName,再byType
  • @Autowired支持泛型依赖注入
  • @Autowired官方已经不再推荐使用,建议使用@Resource

@Autowired

规则

  1. 使用该注解时,将会在容器中寻找要注入的类型,如果只有一个该类型,那么就直接进行注入即可
  2. 如果容器中有多个类型,那么会使用变量名作为id进行查找,找到则进行注入,否则抛出异常
  3. 如果想要实现指定id进行注入,那么可以和@Qualifier配合使用,实现指定id进行注入

验证单个类型

        首先创建一个bean,名字就叫UserDao

@Repository
public class UserDao {
}

         然后创建一个UserService,里面有UserDao属性

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }
}

         上面的代码就表示自动注入UserDao属性,然后创建测试方法,然后运行查看控制台输出

    @Test
    public void t1(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService = ioc.getBean("userService", UserService.class);
        System.out.println(userService.getUserDao());
    }

[spring学习]8、@Autowired和@Resource的区别

         可以发现注入成功


验证多个类型

        上面是只有一个UserDao,下面我们在xml中再配置一个

    <bean class="com.ttpfx.spring.dao.UserDao"/>

         同样运行上面的测试方法,发现还是成功注入

[spring学习]8、@Autowired和@Resource的区别

         成功注入的原因是因为我们通过注解和xml都没有指定id,这样注解配置的默认id就是类名首字母小写。而xml就是全类名后面使用#进行编号,下面为容器中所有的bean

[spring学习]8、@Autowired和@Resource的区别

         根据第二点的规则,我们下面将UserService中的UserDao属性名改为dao,继续运行改测试方法

@Service
public class UserService {

    @Autowired
    private UserDao dao;

    public UserDao getUserDao() {
        return dao;
    }
}

         控制台输出如下

[spring学习]8、@Autowired和@Resource的区别

        表示容器中有多个重复的bean,而又找不到id为dao的bean


使用@Qualifier指定id

        单独的@Autowired不能指定id,如果想要指定id,那么就和@Qualifier配合使用即可,我们在要@Autowired下面加上该注解,里面写上id即可

@Service
public class UserService {

    @Autowired
    @Qualifier("userDao")
    private UserDao dao;

    public UserDao getUserDao() {
        return dao;
    }
}

        下面为测试方法控制台输出的信息

[spring学习]8、@Autowired和@Resource的区别

         成功运行,我们就可以通过@Qualifier来进行指定id注入


特别说明 

        在idea中,我们将鼠标放到@Autowired上面,显示信息如下

[spring学习]8、@Autowired和@Resource的区别

         说明@Autowired已经不推荐使用了


 @Resource

        这个注解可以理解为@Autowired的加强版本,可以指定id进行注入,也可以指定类型进行注入,推荐使用这个

规则

  1. 比较重要的2个属性是name和type,指定了name,那么就是根据id进行注入,指定了type,那么就是根据指定类型进行注入
  2. 如果name和type都不指定,那么先根据属性名作为id进行查找,如果找不到那么再按照类型进行查找,还是找不到就报错

通过name或type进行注入

        还是使用上面的代码,只是把@Autowired改为@Resource,我们先在里面指定name,也就是指定id

@Service
public class UserService {

    @Resource(name = "userDao")
    private UserDao dao;

    public UserDao getUserDao() {
        return dao;
    }
}

        测试方法输出结果如下,没有问题

[spring学习]8、@Autowired和@Resource的区别

         通过type来设置通过类型注入,就是先查找对应类型,然后看是否唯一,不唯一就在按照id进行查找,和Autowired没什么区别,就不进行测试了


name和type都不进行指定

        2个都不进行指定,由于我们在容器中配置了2个UserDao,而id也没有对应的,肯定要报错,运行,控制台输出如下

@Service
public class UserService {

    @Resource
    private UserDao dao;

    public UserDao getUserDao() {
        return dao;
    }
}

[spring学习]8、@Autowired和@Resource的区别

         把属性名改为userDao,然后再运行测试方法,发现注入成功

@Service
public class UserService {

    @Resource
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }
}

[spring学习]8、@Autowired和@Resource的区别

         我们不改属性名,直接将在xml中配置的另外一个UserDao删除掉,然后运行测试方法,查看输出

@Service
public class UserService {

    @Resource
    private UserDao dao;

    public UserDao getUserDao() {
        return dao;
    }
}

[spring学习]8、@Autowired和@Resource的区别

         总的来说,@Resource就是@Autowired的加强版本,建议使用这个


总结

        上面验证的可能不是很完善,其他的验证还请自己用代码进行求证。总之,在spring中,进行注入建议使用@Resource。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140261.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!