详解Spring依赖注入的三种方式使用及优缺点
作者:蜡笔小心眼子! 发布时间:2023-06-09 18:29:00
前置说明:这里的代码演示都是在UserController类里面使用UserService类,然后通过启动类调用UserController类,观察在UserController中是否通过三种依赖注入的方式获取到UserService对象,UserService代码及启动类(App)代码如下:
@Service
public class UserService {
public void sayHi() {
System.out.println("do userService sayHi()");
}
}
public class App {
public static void main(String[] args) {
//1.获取 Spring 上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2.获取 Bean 对象
UserController userController = context.getBean("userController", UserController.class);
//3.使用 Bean 对象
userController.sayHi();
}
}
一,属性注入
1,属性注入的使用
属性注入针对于属性,将需要注入的Bean对象(这里是UserService)加上@Autowired注解(该单词的意思为自动注入),此时就可以将该对象从Spring容器中取出(前提必须加上五大类注解,否则Spring容器中不会有这个对象)
2,属性注入的优缺点
优点:
属性注入只需要在属性上面加一个@AutoWired注解,写法简便,可读性高,易维护(绝大部分实际开发中使用的都是属性注入的方式)
缺点:
不能注入final类修饰的属性;
属性注入兼容度差,只能在IoC容器中才能使用(类与IoC容器高度耦合),使用其他框架时不能使用属性注入;
属性注入容器违背单一职责原则(单一职责原则:一个类最好只能做一件事,功能最好是单一的,在属性注入这里指的就是一个类最好只注入一个属性),因为属性注入简单方便的优势,开发者在开发的过程中就容易滥用属性注入,导致一个类中注入多个对象.
二,Setter注入
1,setter注入的使用
Setter注入就是使用Java的setter方法配合注解将Bean注入到当前类中;
Setter注入针对于setter方法,通过方法将Bean对象从Spring中获取到并进行赋值(前提必须加上五大类注解,否则Spring容器中不会有这个对象)
2,Setter注入的优缺点
优点:
Setter注入满足单一设计职责原则:因为setter方法的特性就是一个setter方法只对应一个对象,不会有注入多个对象的可能性;
缺点:
不能注入final修饰的对象;
注入的对象可能会被修改:由于setter方法可以被多次调用,可能存在被修改的风险;
三,构造方法注入
1,构造方法的使用
构造方法顾名思义针对于构造方法,在构造方法上面加上注解将Bean对象注入到当前类中(前提必须加上五大类注解,否则Spring容器中不会有这个对象)
2,构造方法的特点(不同于其他两种注入方式)
当类中只有一个吻构造方法时可以省略@Autowired,当有多个构造方法时不可以省略,否则会报错(因为多个构造方法时不知道默认给哪个构造方法加注解);
3,构造方法注入的有优缺点
优点:
能够注入final修饰的对象;
注入的对象不会被修改:因为构造方法只会被执行一次;
构造方法注入是完全初始化的:因为依赖注入是在构造方法内部执行的,而构造方法又是在类起初创建的时候就执行的,所以会被完全初始化;
通用性更好:构造方法注入因为基于Java的,JDK是最底层框架,所以无论在哪一个框架都可以适用.
缺点:
构造方法可以注入多个对象,违背了单一设计原则(假设这里再添加一个StudentService对象观察是否可以通过构造方法注入):
构造方法的写法较为麻烦.
四,final对象能否被注入的原因
Java规定被final修饰的属性只能在两个地方进行赋值:
在定义的时候就进行赋值
在构造方法内部进行赋值
属性注入和Setter方法注入都没有在定义的时候赋值(属性注入没有进行赋值,Setter方法注入是通过setter这个普通方法进行的赋值),构造方法则是通过构造方法进行了赋值,所以前两个不能注入final修饰的类,后者可以!
来源:https://blog.csdn.net/qq_47908816/article/details/130257759


猜你喜欢
- [LeetCode] 205. Isomorphic Strings 同构字符串Given two strings s
- 实现方式和继承方式有什么区别呢?*区别:*继承Thread:线程代码存放在Thread子类run方法中*实现Runnable:线程代码存放在
- 一个请求从客户端发出到达服务器,然后被处理的整个过程其实是非常复杂的。本博客主要介绍请求到达服务器被核心组件DispatcherServle
- 说明一下性能方面 还可以接受 循环1000次普通Switch是用了0.001秒 ,扩展函数为0.002秒 , 如果是大项目在有负
- 前些天,有一个需求要用SpringBoot的多环境,当时没有系统学习springboot ,所以在网上找来找去的找到了一个解决方案,并写了一
- 本文实例为大家分享了Android录制音频文件的具体代码,供大家参考,具体内容如下1、这个demo中没有对多次点击同一个声音文件做详细处理,
- 前言在之前的文章我们复习了 ViewGroup 的测量与布局,那么我们这一篇效果就可以在之前的基础上实现一个灵活的九宫格布局。那么一个九宫格
- 目录前言:一、IronPython二、Python打包exe调用三、Python提供WebApi接口(推荐)总结:前言:在平时工作中,需求有
- Java 官网对Looper对象的说明:public class Looperextends ObjectClass used to run
- 首先我们应该清楚的是JDK1.6和JDK1.7中String类的intern方法还是有差别的: JDK1.6中的int
- 一、基本概念(重要)Integer 是 int 的包装类,int 则是 java 的一种基本数据类型;Integer 变量必须实例化后才能使
- 大家都知道NPOI组件可以在你本地没有安装office的情况下来 读取,创建excel文件。但是大家一般都是只默认读取一个excel文件的第
- 本文实例讲述了Android编程开发ScrollView中ViewPager无法正常滑动问题解决方法。分享给大家供大家参考,具体如下:这里主
- 目录图像修复API操作效果源码图像修复实际应用中,图像常常容易受损,如存在污渍的镜头、旧照片的划痕、人为的涂画(比如马赛克),亦或是图像本身
- 1、修改application.properties新建 Mapper、实体类 相应的文件夹,将不同数据源的文件保存到对应的文件夹下# te
- 本文实例讲述了C#基于UDP进行异步通信的方法。分享给大家供大家参考。具体如下:服务器端:using System;using System
- 软件版本:IDEA 2020.1Maven 3.6.3 认识静态资源和动态资源静态资源,包含HTMl,图片,CSS,JS等不需要与
- Java5 在 java.util.concurrent 包中已经包含了读写锁。尽管如此,我们还是应该了解其实现背后的原理。读/写锁的 Ja
- 最近在做一个平板的应用,底部的BACK HOME 还有电池WIFI的那一条STATUS_BAR设置全屏后怎么也去不掉,查找资料后,发现一个比
- Spring数据源的配置数据源(连接池)的作用数据源(连接池)是提高程序性能如出现的事先实例化数据源,初始化部分连接资源使用连接资源时从数据