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

 更新时间:2023年04月20日 10:37:56   作者:蜡笔小心眼子!  
这篇文章主要介绍了spring依赖注入的三种方式的使用方法,以及优缺点的介绍,通过代码示例介绍的非常详细,感兴趣的小伙伴可以参考一下

前置说明:这里的代码演示都是在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修饰的类,后者可以!

以上就是详解Spring依赖注入的三种方式使用及优缺点的详细内容,更多关于pring依赖注入方式及优缺点的资料请关注脚本之家其它相关文章!

相关文章

  • mybatis-plus 插入修改配置默认值的实现方式

    mybatis-plus 插入修改配置默认值的实现方式

    这篇文章主要介绍了mybatis-plus 插入修改配置默认值的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java读写.properties文件解决中文乱码问题

    Java读写.properties文件解决中文乱码问题

    这篇文章主要介绍了Java读写.properties文件解决中文乱码问题,非常具有实用价值,需要的朋友可以参考下
    2017-11-11
  • rocketmq client 日志的问题处理方式

    rocketmq client 日志的问题处理方式

    这篇文章主要介绍了rocketmq client 日志的问题处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 解决springboot集成rocketmq关于tag的坑

    解决springboot集成rocketmq关于tag的坑

    这篇文章主要介绍了解决springboot集成rocketmq关于tag的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 深入理解Java中的WeakHashMap

    深入理解Java中的WeakHashMap

    这篇文章主要介绍了深入理解Java中的WeakHashMap,WeakHashMap从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底搞懂,我们还需要知道四种引用,需要的朋友可以参考下
    2023-09-09
  • Java IO流 File类的常用API实例

    Java IO流 File类的常用API实例

    这篇文章主要介绍了Java IO流 File类的常用API实例的相关资料,需要的朋友参考下吧
    2017-05-05
  • mybatis plus时间判断问题

    mybatis plus时间判断问题

    在MyBatisPlus中,时间判断可以通过XML转义的方式实现,例如使用>、<、<>、>=、<=进行比较,这种方法涉及到SQL符号的转义,确保查询语句的安全性和准确性,特别是在处理大于、小于和等于等逻辑时,正确的转义能够防止SQL注入等安全问题
    2024-09-09
  • SpringBoot多模块如何统一管理

    SpringBoot多模块如何统一管理

    本文详细介绍了SpringBoot多模块项目的统一管理方法,包括核心思想、Maven和Gradle的统一管理实践以及最佳实践和技巧,通过集中化配置、约定优于配置、减少重复性工作,可以提高多模块项目的可维护性、一致性和可扩展性
    2025-03-03
  • MyEclipse打开文件跳转到notepad打开问题及解决方案

    MyEclipse打开文件跳转到notepad打开问题及解决方案

    windows系统打开README.md文件,每次都需要右键选择notepad打开,感觉很麻烦,然后就把README.md文件打开方式默认选择了notepad,这样每次双击就能打开,感觉很方便,这篇文章主要介绍了MyEclipse打开文件跳转到notepad打开问题,需要的朋友可以参考下
    2024-03-03
  • SpringTask-Timer实现定时任务的详细代码

    SpringTask-Timer实现定时任务的详细代码

    在项目中开发定时任务应该一种比较常见的需求,今天通过示例代码给大家讲解SpringTask-Timer实现定时任务的相关知识,感兴趣的朋友一起看看吧
    2024-06-06

最新评论