博客
关于我
Spring依赖注入
阅读量:718 次
发布时间:2019-03-21

本文共 2520 字,大约阅读时间需要 8 分钟。

Spring依赖注入详解

在软件开发中,依赖注入是一种强大的设计模式,能够有效提升代码的可维护性和复用性。尤其在Spring框架中,通过容器管理Bean之间的依赖关系,开发者可以更加专注于业务逻辑的实现,而不是繁琐的依赖管理。

依赖注入概述

在传统的Java程序中,类之间的依赖关系是单向的,通常由调用者负责创建和注入被依赖对象。然而,这种模式会导致类之间的耦合度过高,复杂化和调试困难。在依赖注入(Dependency Injection, DI)模式下,创建被依赖对象的责任被转移到第三方(如Spring容器),通过反转控制(Inversion of Control, IoC)将依赖关系注入到目标对象中。

Spring基于设值函数的依赖注入

这一注入方式通过Spring容器将被依赖对象注入目标Bean的属性字段或方法参数中。常见的方式是使用 setter方法,或者在构造函数中注入。

实例说明

假设有以下两个Bean:

  • AccountDaoImpl

    public class AccountDaoImpl implements AccountDao {    @Override    public void add() {        System.out.println("save account...");    }}
  • AccountServiceImpl

    public class AccountServiceImpl implements AccountService {    private AccountDao accountDao;    public void setAccountDao(AccountDao accountDao) {        this.accountDao = accountDao;    }    @Override    public void addAccount() {        this.accountDao.add();        System.out.println("account added!");    }}
  • 在Spring配置文件中,配置这两个Bean的关系:

    测试与输出

    通过Spring上下文加载Bean:

    public class TestDI_1 {    public static void main(String[] args) {        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");        AccountService accountService = applicationContext.getBean("accountService");        accountService.addAccount();    }}

    运行后,控制台将输出:

    save account...account added!

    Spring基于构造函数的依赖注入

    这种方法通过在构造函数中注入依赖对象,适用于那些依赖关系明确且在构建时需要明确设置的场景。

    实例说明

    改进后的 AccountServiceImpl_2

    public class AccountServiceImpl_2 implements AccountService {    private AccountDao accountDao;    public AccountServiceImpl_2(AccountDao accountDao) {        System.out.println("Inside AccountServiceImpl_2 constructor.");        this.accountDao = accountDao;    }    @Override    public void addAccount() {        System.out.println("account added again!");    }}

    Spring配置文件:

    测试与输出

    通过Spring上下文加载Bean:

    public class TestDI_2 {    public static void main(String[] args) {        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");        AccountService accountService2 = applicationContext.getBean("accountService2");        accountService2.addAccount();    }}

    运行后,控制台将输出:

    Inside AccountServiceImpl_2 constructor.save account...account added again!

    两种注入方式对比

    • 构造注入的优势

      • 适用于明确依赖关系的场景,降低类之间偶合度。
      • 优先注入优先级高的依赖关系,实现更灵活的注入顺序控制。
      • 适合内部化的依赖管理,确保单元测试环境的独立性。
    • 设值注入的优势

      • 操作简便,开发者习惯 setter 方法的方式更为直观。
      • 适用于对依赖关系的可选性需求,对于一些非必需属性的设置更加舒适。
      • 避免了构造函数过长的问题,降低代码可读性。

    选择哪种方式取决于具体的场景需求。无论建立哪种形式,Spring的依赖注入都是提升代码可维护性的高效方式。

    转载地址:http://hjygz.baihongyu.com/

    你可能感兴趣的文章
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>
    multi-angle cosine and sines
    查看>>
    Mysql Can't connect to MySQL server
    查看>>
    mysql case when 乱码_Mysql CASE WHEN 用法
    查看>>
    Multicast1
    查看>>
    mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>
    Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
    查看>>
    MySQL Cluster与MGR集群实战
    查看>>
    multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
    查看>>
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>