@Autowired和@Resource的区别

@Autowired和@Resource的区别,第1张

@Autowired和@Resource的区别 引入

​ 不知道大家偶没有遇见这样的情况,在注入service服务层的时候用@Autowired注解它下面总是有一条黄色的波浪线,像这样

然后换成@Resource后,黄色波浪线消失了。

我问了公司的大佬说@Autowired注解是Spring的,@Resource是JDK的,这俩实际区别不大,介于强迫症让波浪线消失所以用了@Resource注解。然后昨天刷抖音看见了一个博主讲解了这两个注解的区别,所以记录一下。

环境构建

首先我在这里定义了一个接口TestService,下面有一个hello()方法。

public interface TestService {
     void hello();
}

然后两个实现类TestServiceImpl01和TestServiceImpl02都实现这个方法。

TestServiceImpl01

@Service
public class TestServiceImpl01 implements TestService {
    @Override
    public void hello() {
        System.out.println("hello TestServiceImpl01");
    }
}

TestServiceImpl02

@Service
public class TestServiceImpl02 implements TestService {
    @Override
    public void hello() {
        System.out.println("hello TestServiceImpl02");
    }
}

最后再注入接口,并调用方法,这里我们先通过@Resource注入

@SpringBootApplication
public class Applicatiion implements CommandLineRunner {


    @Resource
    private TestService testService;

    public static void main(String[] args) {
        SpringApplication.run(Applicatiion.class,args);
    }

    @Override
    public void run(String... args) throws Exception {
        testService.hello();
    }
}
@Resource注解

@Resource注解默认通过名称注入,如名称无法找到,则通过类型注入

名称的话我们这里别名是testService,它找不到,然后就会通过类型去找,就会找到两个,TestServiceImpl01和TestServiceImpl02,所以我们运行的时候会报错

大致意思就是要求一个单一的bean,但是找到了两个。

如果想解决这个报错,第一种方式就是删除一个实现类,第二种方式就是在注入的时候改名称。

    @Resource
    private TestService testServiceImpl01;


相当于它按照名称去找,testServiceImpl01或者testServiceImpl02,具体实现就是看名称,这里可能有人会问我实现类名称不是TestServiceImpl01和TestServiceImpl02吗,其实在注入bean的时候会把首字母变成小写,所以能匹配到。

@Autowired注解

@Autowired注解默认是先通过类型注入,如果存在多个类型则通过名称注入

@SpringBootApplication
public class Applicatiion implements CommandLineRunner {


    @Autowired
    private TestService testService;

    public static void main(String[] args) {
        SpringApplication.run(Applicatiion.class,args);
    }

    @Override
    public void run(String... args) throws Exception {
        testService.hello();
    }
}

运行也会报错


其实在注入的时候它也已经提示你了


我们可以通过之前的方法修改名称来解决这个问题。

也可以通过@Qualifier注解来指定用哪个bean。

    @Autowired
    @Qualifier("testServiceImpl01")
    private TestService testService;

除此之外还可以通过@Primary来指定优先使用哪一个bean

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/788290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存