详解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
猜你喜欢
- 一、什么是SFTP?SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务
- 一、@Configuration注解1、基本使用自定义配置类/** * 1、@Configuration 告诉SpringBoot这是一个配
- pom.xml文件需要的内容<dependency> <groupId>re
- 一、文件存储特点:openFileInput()和openFileOutput()读取设备上的文件。优点:适用于存储大量的数据,可以存储图片
- ContentProvider是内容提供者,可以跨进程提供数据。大家都知道,ContentProvider的启动,是在Application
- 以下四种方式:1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象
- 一、静态代理模式1.1、 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标
- @pathvariable与@requestparam碰到的一些问题一、@pathvariable可以将 URL 中占位符参数绑定到控制器处
- 一、前言正常情况下classloader只能找到jar里面当前目录或者文件类里面的*.class文件。为了能够加载嵌套jar里面的资源之前都
- 本文实例讲述了Java基于Runtime调用外部程序出现阻塞的解决方法, 是一个很实用的技巧。分享给大家供大家参考。具体分析如下:有时候在j
- AsyncTask什么是AsyncTaskAsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传
- 这篇文章主要介绍了Java ForkJoin框架的原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- Lombok有什么用在我们实体Bean中有大量的Getter/Setter方法以及toString, hashCode等可能不会用到,但是某
- static修饰符是java里面非常常用的一个东西,用法也非常多。然而,在kotlin里竟然没有这个东西!那该如何替代呢?本文就总结了下ja
- 在logback.xml中加上该配置,包名如:com.xxx<logger name="packageName"
- 前言对于数组遍历,基本上每个开发者都写过,遍历本身没什么好说的,但是当我们在遍历的过程中,有一些复杂的业务逻辑时,将会发现代码的层级会逐渐加
- 绝对路径:不可改变的路径本地绝对路径:增加盘符的路径(e:/test/test.html)网络绝对路径:增加协议,IP地址,端口号的路径(h
- java.sql.Timestamp(时间戳)继承父类:java.util.Date所有已实现的接口:Serializable, Clone
- 好久没有做web了,JSON目前比较流行,闲得没事,所以动手试试将对象序列化为JSON字符(尽管DotNet Framework
- 首先我们看看为什么需要对象复制?为什么需要对象复制如上,是我们平时开发中最常见的三层MVC架构模型,编辑操作时Controller层接收到前