1.成员变量注入

@RestController
public class StudentController{@Autowiredprivate LiSi liSi;@GetMapping("/say")public String say() {return liSi.say();}
}

2.构造函数注入

方式一: 普通的构造方法
@RestController
public class StudentController{private LiSi liSi;@Autowiredpublic StudentController(LiSi liSi){this.liSi = liSi;}@GetMapping("/say")public String say() {return liSi.say();}
}方式二:lombok注解实现构造函数的注入
@RestController
@AllArgsConstructor
public class StudentController{// 变量需要被final修饰private final LiSi liSi;@GetMapping("/say")public String say() {return liSi.say();}
}

3. setter方法注入

@RestController
public class StudentController{private LiSi liSi;@Autowiredpublic void setLiSi(LiSi liSi){this.liSi = liSi;}@GetMapping("/say")public String say() {return liSi.say();}
}

4. 结合@Qualifier使用的情况

前提:ZhangSan和LiSi两个Bean对象都被Spring的IOC管理,并且两者都实现相同的接口Student。情况一:public class StudentController{@Qualifier("liSi")@Autowiredprivate Student student;@GetMapping("/say")public String say() {return student.say();}}此时注入到StudentController中的其实是liSi,如果不加@Qualifier的话通过类型会找到两个bean,无法确定,这个时候spring会根据名字去找,通过字段名student找也找不到对应bean,最后报错。情况二:public class StudentController{@Autowiredprivate Student liSi;@GetMapping("/say")public String say() {return liSi.say();}}这种写法也可以,先通过类型找到两个bean对象,再通过字段名liSi找到一个对应的bean注入成功。这种写法对于字段名称的定义较严格,一般是注入对象的首字母小写。

5. 总结

  • Spring中Autowired注入的两种方式:
byType:默认是按照类型注入,与bean的属性具有相同类型的其他bean自动装配到bean的对应属性中。byName:与bean的属性具有相同名字的其他bean,自动装配到对应的属性中。(名字一般为首字母小写,例如:LiSi 在 容器中的名字为 liSi)
  • 装配过程总结:
1. 找不到任何bean时直接报错
2. 找到一个,直接注入
3. 同一个类型找到多个时,按类型注入已经不可能;此时spring会再次按照名称注入,如果没有同名的bean就报错。
4. 通过@Qualifier可以对注入的过程有更多的控制,当有多个相同类型的bean时可通过@Qualifier来指定名称;或者直接将属性名定义为和要注入的bean一样的名称也可以实现注入。

6. 用到的实体

  • LiSi:(适用于1、2、3)
import org.springframework.stereotype.Component;
/*** @author gxn*/
@Component
public class LiSi{public String say() {return "I am Li Si!";}
}
  • ZhangSan:(适用于1、2、3)
import org.springframework.stereotype.Component;
/*** @author gxn*/
@Component
public class ZhangSan{public String say() {return "I am Zhang San!";}
}
  • Student:
import org.springframework.stereotype.Component;
/*** @author gxn*/
@Component
public interface Student {/*** 学生的说话方法* @return*/public String say();
}

注意: 为验证4中的场景对LiSi和ZhangSan做了调整,让他们去实现Student,模拟通过类型找到两个bean的情况。

  • 修改后的LiSi:(适用于4)
import org.springframework.stereotype.Component;
/*** @author gxn*/
@Component
public class LiSi implements Student{@Overridepublic String say() {return "I am Li Si!";}
}
  • 修改后的ZhangSan:(适用于4)
import org.springframework.stereotype.Component;
/*** @author gxn*/
@Component
public class ZhangSan implements Student{@Overridepublic String say() {return "I am Zhang San!";}
}

SpringBoot之三种常见的依赖注入方式相关推荐

  1. ASP.NET Core应用的7种依赖注入方式

    ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...

  2. spring四种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. spring提出了依赖注入的思想,即依赖不由程序 ...

  3. Spring中IoC两种接口和两种依赖注入方式的比较

    spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...

  4. 一文带你掌握OBS的两种常见的鉴权方式

    OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用.在调用OBS的API前,需要了解OBS的鉴权认证方式.本文就将 ...

  5. CSS几种常见的页面布局方式介绍

    问题:CSS几种常见的页面布局方式介绍? CSS常见的有以下7种,必须要掌握的是前3种: flex弹性盒子(弹性布局): rem布局(一般都是flex+rem使用的比较多): 响应式布局(响应式布局的 ...

  6. 9种常见的INTERNET接入方式

    9种常见的INTERNET接入方式 提到接入网,首先要涉及一个带宽问题,随着互联网技术的不断发展和完善,接入网的带宽被人们分为窄带和宽带,业内专家普遍认为宽带接入是未来发展方向. 宽带运营商网络结构如 ...

  7. 静态代理和依赖注入方式获取网店管家查询仓库信息接口

    请求的URL地址http://localhost/tp5.1/public/index.php/index/wdgj/wdgjwarehouselistGet?page=1&pageSize= ...

  8. 几种常见网络抓包方式介绍

    几种常见网络抓包方式介绍 一.网络分流器(TAP) 二.有网管功能的小交换机 三.用两块网卡的Linux方案 四.总结 无论作为网络运维人员,还是安全渗透工程师,在工作中都会无可避免地碰到网络抓包的需 ...

  9. Spring:Bean依赖注入方式

    目录 1 依赖注入方式 1.1 创建maven工程 pom.xml 1.2 创建bean Student.java Teacher.java 1.3 创建配置文件 applicationContext ...

最新文章

  1. arcgis自动完成面怎么用_硬派的自然断裂面石材怎么用才美?
  2. Appearing and Disappearing consts in C++
  3. C++成员对象和封闭类
  4. Bokeh,一个超强交互式Python可视化库!
  5. 手机网页(WAP)页面上的输入框默认键盘类型
  6. [COM/ATL]组件、对象、MFC、ATL的区别
  7. [vue] watch的属性用箭头函数定义结果会怎么样?
  8. 用java写一个日历_使用JAVA写一个简单的日历
  9. datagrid如何获取一行数据中的某个字段值_SQL中常见的面试题
  10. Linux多线程实践(9) --简单线程池的设计与实现
  11. Apache Kylin 部署之不完全指南
  12. Python---(9)数据科学领域常用的15个Python包
  13. QT界面大小自动变化
  14. uniapp实现瀑布流基本写法
  15. style, currentStyle, getComputedStyle的区别
  16. BZOJ3639 Query on a tree VII
  17. Office2010安装相关问题及解决方法
  18. 摩尔庄园怎么显示全部服务器,摩尔庄园手游怎么看自己玩的什么服,服务器查看区别方法...
  19. java string 深拷贝_探讨java深拷贝
  20. 【它山之玉】慎重选择博士后(或博士生)导师-科学网马臻

热门文章

  1. shell脚本修改xcode项目的包名、app名字
  2. 基于PyQT5的翻译小程序(支持百度翻译和有道词典)
  3. cisco交换机常用配置命令
  4. 张博涵清华大学_大家对清华大学2019年特奖候选人选有何预测?
  5. 这些设置 就是导致你的IDEA卡爆的原因!
  6. 2023-04-23 学习记录--C/C++-函数
  7. 【IT名词】计算机篇
  8. Java 语言中一个字符占几个字节?
  9. Element的input密码框小眼睛(点击眼睛显示密码,再次点击图标隐藏密码)
  10. 3月份安全软件品牌报告 金山、360负面缠身