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

    你可能感兴趣的文章
    Nacos基础版 从入门到精通
    查看>>
    Nacos如何实现Raft算法与Raft协议原理详解
    查看>>
    Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(上)
    查看>>
    Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
    查看>>
    Nacos心跳机制实现快速上下线
    查看>>
    nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
    查看>>
    nacos服务提供和发现及客户端负载均衡配置
    查看>>
    Nacos服务注册与发现demo
    查看>>
    Nacos服务注册与发现的2种实现方法!
    查看>>
    nacos服务注册和发现原理简单实现案例
    查看>>
    Nacos服务注册总流程(源码分析)
    查看>>
    nacos服务注册流程
    查看>>
    Nacos服务部署安装
    查看>>
    nacos本地可以,上服务器报错
    查看>>
    Nacos注册Dubbo(2.7.x)以及namespace配置
    查看>>
    Nacos注册中心有几种调用方式?
    查看>>
    nacos注册失败,Feign调用失败,feign无法注入成我们的bean对象
    查看>>
    nacos源码 nacos注册中心1.4.x 源码 nacos源码如何下载 nacos 客户端源码下载地址 nacos discovery下载地址(一)
    查看>>
    nacos源码 nacos注册中心1.4.x 源码 spring cloud alibaba 的discovery做了什么 nacos客户端是如何启动的(二)
    查看>>