@Autowired和@Resource的区别

@Autowired和@Resource都是Spring框架中用于依赖注入的注解,它们的作用是将一个依赖对象自动注入到另一个对象中。它们的区别如下:

@Autowired是Spring自带的注解,而@Resource是Java EE 5规范中定义的注解,需要依赖JDK或者其他框架的支持。

@Autowired默认按照类型进行自动装配,如果有多个同类型的Bean,则需要通过@Qualifier指定具体的Bean名称。而@Resource默认按照名称进行自动装配,如果没有指定名称,则默认使用成员变量名称作为Bean名称。

@Autowired是通过BeanPostProcessor实现的,而@Resource是通过javax.annotation.Resource实现的。

@Autowired可以注入任意类型的Bean,包括自定义类型、接口类型、抽象类类型等。而@Resource只能注入Java EE规范中定义的资源,例如DataSource、JMS ConnectionFactory等。

总的来说,如果项目是基于Spring框架的,建议使用@Autowired注解,但是当使用@Autowired注入时如果是一个RedisTemplate,如下:

    @Autowired
    private RedisTemplate<String,Integer> redisTemplate;

这时会报以下错误:

Field redisTemplate in ... required a bean of type ...RedisTemplate' that could not be found.

这是因为@Auowired是根据类型来注入的,泛型也被算在里面,而RedisTemplate里并没有想要注入的这一类型,所以注入失败,而@Resource默认根据名称注入,RedisTemplate这个bean在我们的RedisConfig里被加到了spring容器中,所以可以注入。这时有几种解决方式:

1、将RedisTemplate对象上的注解从@Autowired改成@Resource;

2、在注入RedisTemplate的时候将泛型去掉

3、添加依赖:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

4、可以通过创建一个bean,加上泛型的RedisTemplate交给IOC容器管理

posted @   hwj7  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示