@Autowired和@Resource的区别

发布时间 2023-09-14 15:05:47作者: hwj7

@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容器管理