kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

Autowaired.md

发表于 2020-08-10 更新于 2021-11-21 分类于 SpringBoot
本文字数: 707 阅读时长 ≈ 1 分钟

面向抽象的编程,通常,我们会在类中定义接口,而注入的是接口的实现类。

举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/v1/banner")
public class BannerController {

@Autowired
private Skill diana;

@GetMapping(value = "test")
public String test() {
diana.R();
return "ok";
}
}

这里的Skill是接口。如果它有两个实现类Diana和Itera,那么到底哪个实现类会被注入呢?

注入的时候可能会发生的几种情况:

1.找不到任何一个bean ,报错

2.只找到一个bean,直接注入

3.找到多个bean,并不一定会报错,按照字段名字推断选择哪个bean

其实,总结起来就是两种方式:

1.通过类型注入

2.通过name注入

通过类型注入的优先级 > 通过name注入。@Autowaired默认是通过类型注入。

当注入Skill的实现类时,发现了有多个实现类,此时通过类型注入不能决定应该注入哪个实现类。

既然通过类型决定不了,就会通过字段名去推断要注入哪个类。而这种通过类型和name的注入是被动地注入,我们也可以使用@Qualify(“diana”)来指明主动地注入某一个实现类。

1
2
3
@Autowired
@Qualifier("itrea")
private Skill diana;

即使这里的字段名是diana,而我们使用了@Qualify主动注入了itera。最终注入的实现类还是itrea,调用的方法还是itrea的方法。

一毛也是爱~
Kim.Zhang 微信支付

微信支付

# 注解
延时加载.md
Configuration.md
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%