详解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,属性注入的使用

详解Spring依赖注入的三种方式使用及优缺点

属性注入针对于属性,将需要注入的Bean对象(这里是UserService)加上@Autowired注解(该单词的意思为自动注入),此时就可以将该对象从Spring容器中取出(前提必须加上五大类注解,否则Spring容器中不会有这个对象)

详解Spring依赖注入的三种方式使用及优缺点

 2,属性注入的优缺点

优点:

属性注入只需要在属性上面加一个@AutoWired注解,写法简便,可读性高,易维护(绝大部分实际开发中使用的都是属性注入的方式)

缺点:

  • 不能注入final类修饰的属性;

详解Spring依赖注入的三种方式使用及优缺点

  •  属性注入兼容度差,只能在IoC容器中才能使用(类与IoC容器高度耦合),使用其他框架时不能使用属性注入;

  • 属性注入容器违背单一职责原则(单一职责原则:一个类最好只能做一件事,功能最好是单一的,在属性注入这里指的就是一个类最好只注入一个属性),因为属性注入简单方便的优势,开发者在开发的过程中就容易滥用属性注入,导致一个类中注入多个对象.

二,Setter注入

1,setter注入的使用

Setter注入就是使用Java的setter方法配合注解将Bean注入到当前类中;

详解Spring依赖注入的三种方式使用及优缺点

 Setter注入针对于setter方法,通过方法将Bean对象从Spring中获取到并进行赋值(前提必须加上五大类注解,否则Spring容器中不会有这个对象)

详解Spring依赖注入的三种方式使用及优缺点

2,Setter注入的优缺点

优点:

Setter注入满足单一设计职责原则:因为setter方法的特性就是一个setter方法只对应一个对象,不会有注入多个对象的可能性;

详解Spring依赖注入的三种方式使用及优缺点

 缺点:

  • 不能注入final修饰的对象;

详解Spring依赖注入的三种方式使用及优缺点

  •  注入的对象可能会被修改:由于setter方法可以被多次调用,可能存在被修改的风险;

三,构造方法注入

1,构造方法的使用

详解Spring依赖注入的三种方式使用及优缺点

构造方法顾名思义针对于构造方法,在构造方法上面加上注解将Bean对象注入到当前类中(前提必须加上五大类注解,否则Spring容器中不会有这个对象)

详解Spring依赖注入的三种方式使用及优缺点

2,构造方法的特点(不同于其他两种注入方式)

当类中只有一个吻构造方法时可以省略@Autowired,当有多个构造方法时不可以省略,否则会报错(因为多个构造方法时不知道默认给哪个构造方法加注解);

详解Spring依赖注入的三种方式使用及优缺点

详解Spring依赖注入的三种方式使用及优缺点

 3,构造方法注入的有优缺点

优点:

  • 能够注入final修饰的对象;

详解Spring依赖注入的三种方式使用及优缺点

  •  注入的对象不会被修改:因为构造方法只会被执行一次;

  • 构造方法注入是完全初始化的:因为依赖注入是在构造方法内部执行的,而构造方法又是在类起初创建的时候就执行的,所以会被完全初始化;

  • 通用性更好:构造方法注入因为基于Java的,JDK是最底层框架,所以无论在哪一个框架都可以适用.

缺点:

  • 构造方法可以注入多个对象,违背了单一设计原则(假设这里再添加一个StudentService对象观察是否可以通过构造方法注入):

详解Spring依赖注入的三种方式使用及优缺点

  •  构造方法的写法较为麻烦.

四,final对象能否被注入的原因

Java规定被final修饰的属性只能在两个地方进行赋值:

  • 在定义的时候就进行赋值

  • 在构造方法内部进行赋值

属性注入和Setter方法注入都没有在定义的时候赋值(属性注入没有进行赋值,Setter方法注入是通过setter这个普通方法进行的赋值),构造方法则是通过构造方法进行了赋值,所以前两个不能注入final修饰的类,后者可以!

来源:https://blog.csdn.net/qq_47908816/article/details/130257759

标签:Spring,依赖注入,优缺点,方式使用
0
投稿

猜你喜欢

  • JAVAEE项目结构以及并发随想

    2023-02-22 15:38:52
  • Kotlin Flow常用封装类StateFlow使用详解

    2022-07-16 03:46:28
  • 浅谈一下Servlet的定义以及运行原理

    2023-08-14 10:50:07
  • java虚拟机中多线程总结

    2022-09-01 22:55:48
  • JAVA实现SOCKET多客户端通信的案例

    2023-08-26 19:10:35
  • mybatis-plus3.0.1枚举返回为null解决办法

    2023-11-07 16:59:50
  • 详解Eclipse提交项目到GitHub以及解决代码冲突

    2022-05-15 09:04:52
  • Java如何读取jar包中的resource资源文件

    2022-10-12 22:51:43
  • Android Retrofit框架的使用

    2023-10-05 13:24:21
  • java实现订餐系统

    2023-08-12 04:39:06
  • Java基础之Thymeleaf的简单使用

    2023-08-24 19:00:22
  • 详解Docker学习笔记之搭建一个JAVA Tomcat运行环境

    2022-09-03 02:26:06
  • 详解Java中字符流与字节流的区别

    2023-01-14 00:19:58
  • android之计时器(Chronometer)的使用以及常用的方法

    2021-05-26 12:27:33
  • Java 微信公众号开发相关总结

    2021-11-11 03:43:30
  • JAVA利用HttpClient进行HTTPS接口调用的方法

    2023-10-24 16:28:11
  • Java的可变参数与Collections类的功能示例解析

    2022-03-05 18:45:47
  • Java Socket编程(三) 服务器Sockets

    2023-05-24 21:18:19
  • java发送http的get、post请求实现代码

    2023-02-05 01:46:56
  • 解决springboot项目不配置数据源启动报错问题

    2022-04-27 23:12:21
  • asp之家 软件编程 m.aspxhome.com