博客
关于我
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/

    你可能感兴趣的文章
    python3----ASCII
    查看>>
    Python3-selenium自动化测试框架,结合HTMLTestRunner测试报告!
    查看>>
    Python3-如何自我更新作为服务运行的应用程序
    查看>>
    Python3.1-网格模拟概念性问题
    查看>>
    Python3.12 解决conda环境libstdc++版本过低问题
    查看>>
    python3.2批量查询IP地址区域
    查看>>
    Python3.5中协程和未来/任务之间的区别?
    查看>>
    python3.5实现socket通讯(TCP)
    查看>>
    python3.6 ubuntu部署nginx、 uwsgi、 django
    查看>>
    Python3.6.3中,functools似乎不能用
    查看>>
    python3.6.5+cuda9+cudnn7.1+win10+tensorflow-gpu1.9.0下载配置
    查看>>
    python3.6使用pickle序列化class
    查看>>
    python3.6入门到高阶(全栈) day027 网络通信协议 osi七层模型
    查看>>
    Python3.6属性错误:模块‘;异步没有属性‘;运行‘;
    查看>>
    python3.6版本中的python-weka-wrapper安装失败,错误代码为%1
    查看>>
    Python3.7安装cv2踩过的坑
    查看>>
    python写txt文件
    查看>>
    python关于sorted排序函数详细解析 附实战代码(全)
    查看>>
    python3.8调用m文件,调用matlab
    查看>>
    python3.9新特性_Python 3.9 新特性速览
    查看>>