当前位置: 首页 > article >正文

问:说说Spring中构造函数注入和Setter注入的区别?

在Spring框架中,构造函数注入和setter注入是两种常见的依赖注入方式。它们的主要区别在于依赖对象的注入时机和注入方式。

构造函数注入

构造函数注入是通过类的构造函数来注入依赖对象的。在Spring创建bean实例时,就会通过构造函数将依赖对象传递进去。这种方式确保了依赖对象在bean实例化时就已经被注入,因此可以保证bean在使用时所有依赖都已经准备好。

代码示例

// 定义依赖项
class Database {
    public void connect() {
        System.out.println("Connecting to database...");
    }
}

// 定义需要依赖注入的组件
class UserService {
    private final Database database;

    // 通过构造函数注入依赖项
    public UserService(Database database) {
        this.database = database;
    }

    public void createUser() {
        database.connect();
        System.out.println("Creating a new user...");
    }
}

// Spring配置类
@Configuration
class AppConfig {
    @Bean
    public Database database() {
        return new Database();
    }

    @Bean
    public UserService userService(Database database) {
        return new UserService(database);
    }
}

// 使用Spring容器获取bean并调用方法
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
userService.createUser();

setter注入

setter注入是通过类的setter方法来注入依赖对象的。Spring在创建bean实例后,会调用相应的setter方法将依赖对象注入。这种方式允许在bean实例化后再设置依赖对象,提供了更大的灵活性。

代码示例

// 定义依赖项
class Database {
    public void connect() {
        System.out.println("Connecting to database...");
    }
}

// 定义需要依赖注入的组件
class UserService {
    private Database database;

    // 通过setter方法注入依赖项
    public void setDatabase(Database database) {
        this.database = database;
    }

    public void createUser() {
        database.connect();
        System.out.println("Creating a new user...");
    }
}

// Spring配置类
@Configuration
class AppConfig {
    @Bean
    public Database database() {
        return new Database();
    }

    @Bean
    public UserService userService() {
        UserService userService = new UserService();
        userService.setDatabase(database());
        return userService;
    }
}

// 使用Spring容器获取bean并调用方法
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
userService.createUser();

区别总结

  1. 注入时机:构造函数注入在bean实例化时就会注入依赖对象,而setter注入在bean实例化后会通过setter方法注入依赖对象。
  2. 灵活性:setter注入提供了更大的灵活性,允许在bean实例化后再设置依赖对象,而构造函数注入则要求依赖对象在bean实例化时就必须提供。
  3. 必填性:构造函数注入的依赖项通常是必填的,因为构造函数必须被调用才能创建实例;而setter注入的依赖项可以是可选的,因为setter方法可以在任何时候被调用。
  4. 代码风格:构造函数注入通常更符合不可变对象的设计原则,因为一旦对象被创建,依赖项就不能再被修改;而setter注入则允许在对象生命周期中修改依赖项。

http://www.kler.cn/a/389670.html

相关文章:

  • HBase理论_背景特点及数据单元及与Hive对比
  • 免费,WPS Office教育考试专用版
  • python高效处理大数据:将Excel10万数据分批插入MySQL数据库的实战代码
  • python: postgreSQL using psycopg2 or psycopg
  • 算法——移除链表元素(leetcode203)
  • 网页版五子棋——对战模块(服务器端开发②)
  • Maven 中央仓库地址 mvnrepository.com
  • Maven从浅入深(理解篇)
  • K8S之Prometheus 部署(二十)
  • 《实时流计算系统设计与实现》-Part 1-笔记
  • 算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)
  • FreeRTOS学习11——时间片任务调度
  • 基于多设计模式下的同步异步日志系统
  • C0028.在Clion中快速生成头文件中声明的函数的方法
  • 「Mac畅玩鸿蒙与硬件29」UI互动应用篇6 - 多选问卷小应用
  • Qt QCustomplot 在采集信号领域的应用
  • 5G NR协议栈分层
  • 2024年【R2移动式压力容器充装】考试试题及R2移动式压力容器充装操作证考试
  • AscendC从入门到精通系列(三)基于自定义算子工程开发AscendC算子
  • FastHTML快速入门:调试模式和 URL中的变量
  • CSS——选择器、PxCook软件、盒子模型
  • C++动态库和静态库的特点以及区别
  • WPF中Prism框架的简单使用
  • Linux——gcc编译过程详解与ACM时间和进度条的制作
  • 批量从Excel某一列中找到符合要求的值并提取其对应数据
  • 【笔记】LLC电路工作频点选择 2-1 输出稳定性的限制