SpringBoot之三种常见的依赖注入方式
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之三种常见的依赖注入方式相关推荐
- ASP.NET Core应用的7种依赖注入方式
ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...
- spring四种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. spring提出了依赖注入的思想,即依赖不由程序 ...
- Spring中IoC两种接口和两种依赖注入方式的比较
spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...
- 一文带你掌握OBS的两种常见的鉴权方式
OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用.在调用OBS的API前,需要了解OBS的鉴权认证方式.本文就将 ...
- CSS几种常见的页面布局方式介绍
问题:CSS几种常见的页面布局方式介绍? CSS常见的有以下7种,必须要掌握的是前3种: flex弹性盒子(弹性布局): rem布局(一般都是flex+rem使用的比较多): 响应式布局(响应式布局的 ...
- 9种常见的INTERNET接入方式
9种常见的INTERNET接入方式 提到接入网,首先要涉及一个带宽问题,随着互联网技术的不断发展和完善,接入网的带宽被人们分为窄带和宽带,业内专家普遍认为宽带接入是未来发展方向. 宽带运营商网络结构如 ...
- 静态代理和依赖注入方式获取网店管家查询仓库信息接口
请求的URL地址http://localhost/tp5.1/public/index.php/index/wdgj/wdgjwarehouselistGet?page=1&pageSize= ...
- 几种常见网络抓包方式介绍
几种常见网络抓包方式介绍 一.网络分流器(TAP) 二.有网管功能的小交换机 三.用两块网卡的Linux方案 四.总结 无论作为网络运维人员,还是安全渗透工程师,在工作中都会无可避免地碰到网络抓包的需 ...
- Spring:Bean依赖注入方式
目录 1 依赖注入方式 1.1 创建maven工程 pom.xml 1.2 创建bean Student.java Teacher.java 1.3 创建配置文件 applicationContext ...
最新文章
- arcgis自动完成面怎么用_硬派的自然断裂面石材怎么用才美?
- Appearing and Disappearing consts in C++
- C++成员对象和封闭类
- Bokeh,一个超强交互式Python可视化库!
- 手机网页(WAP)页面上的输入框默认键盘类型
- [COM/ATL]组件、对象、MFC、ATL的区别
- [vue] watch的属性用箭头函数定义结果会怎么样?
- 用java写一个日历_使用JAVA写一个简单的日历
- datagrid如何获取一行数据中的某个字段值_SQL中常见的面试题
- Linux多线程实践(9) --简单线程池的设计与实现
- Apache Kylin 部署之不完全指南
- Python---(9)数据科学领域常用的15个Python包
- QT界面大小自动变化
- uniapp实现瀑布流基本写法
- style, currentStyle, getComputedStyle的区别
- BZOJ3639 Query on a tree VII
- Office2010安装相关问题及解决方法
- 摩尔庄园怎么显示全部服务器,摩尔庄园手游怎么看自己玩的什么服,服务器查看区别方法...
- java string 深拷贝_探讨java深拷贝
- 【它山之玉】慎重选择博士后(或博士生)导师-科学网马臻