• Spring实例化Bean的三种方式及其优缺点


    一、通过构造函数注入方式实例化Bean

    在Spring中,我们可以通过构造函数的方式将需要的依赖注入到Bean中。下面是一个例子:

    1. @Component
    2. public class UserService {
    3. private final UserDao userDao;
    4. @Autowired
    5. public UserService(UserDao userDao) {
    6. this.userDao = userDao;
    7. }
    8. //...
    9. }

    这种方式的主要优点是:

    1. 易于测试。由于依赖是通过构造函数注入的,所以在测试时可以很容易地通过提供Mock对象来替换真实依赖。
    2. 代码清晰。通过构造函数注入,使得代码结构更加清晰,易于理解。

    但是,这种方式也有一些缺点:

    1. 构造函数参数列表可能会变得冗长,尤其是在有很多依赖的情况下。
    2. 可能会违反DRY(Don't Repeat Yourself)原则,如果有很多类需要使用相同的依赖,可能需要重复地在每个类中注入这个依赖。

    二、通过setter方法注入方式实例化Bean

    与构造函数注入方式相比,setter方法注入方式更加灵活。下面是一个例子:

    1. @Component
    2. public class UserService {
    3. private UserDao userDao;
    4. @Autowired
    5. public void setUserDao(UserDao userDao) {
    6. this.userDao = userDao;
    7. }
    8. //...
    9. }

     这种方式的主要优点是:

    1. 更加灵活。setter方法注入允许我们在运行时动态地添加或修改依赖,而不需要修改类的代码。
    2. 适用于已经有默认构造函数的场景。由于setter方法注入是在对象创建后进行的,所以适用于那些已经有一个默认构造函数,但需要在运行时动态地添加或修改依赖的情况。

    但是,这种方式也有一些缺点:

    1. 不易于测试。与构造函数注入相比,setter方法注入的依赖在测试时需要手动进行Mock,相对麻烦。
    2. 可能会引起代码阅读上的困扰。如果一个类的构造方法很简单,但有很多通过setter方法注入的依赖,可能会使得代码阅读者对类的真正依赖关系感到困惑。

    三、通过@Autowired注解直接实例化Bean

    除了上述两种方式,Spring还支持直接通过@Autowired注解来实例化Bean。下面是一个例子:

    1. @Component
    2. public class UserService {
    3. @Autowired UserDao userDao;
    4. //...
    5. }

    这种方式的主要优点是:

    1. 简洁。与上述两种方式相比,这种方式不需要写额外的代码(如构造函数或setter方法),更加简洁。
    2. 对于接口和抽象类,这种方式尤其有用。因为接口和抽象类不能有实现方法(如构造函数或setter方法),所以只能通过@Autowired注解来实例化。

    但是,这种方式也有一些缺点:

    1. 不易于测试。与上述两种方式相比,这种方式在测试时需要手动进行Mock,相对麻烦。同时,如果一个类有很多通过@Autowired注解的依赖,在测试时可能会产生混淆,不知道该Mock哪个依赖。
    2. 可能会引起循环依赖。如果一个Bean A依赖于Bean B,而Bean B又依赖于Bean A,那么在实例化这两个Bean时,就可能产生循环依赖。尽管Spring支持循环依赖,但在设计应用程序时应尽量避免这种情况,因为它可能会导致一些难以预见的问题。
  • 相关阅读:
    云南财经大学计算机考研资料汇总
    nginx出现504 Gateway Time-out错误的原因分析及解决
    深度解析:为何在 SwiftUI 视图的 init 初始化器里无法更改 @State 的值?
    动态缩略图清晰度优化
    怎么把两首歌曲拼接在一起?
    Mysql 数据库基础(重点)
    《机器学习算法竞赛实战》读书笔记
    想升级Mac新版本,无奈内存空间不够该怎么办?
    GO—函数
    红队攻防渗透技术实战流程:中间件安全:IIS&NGINX&APACHE&TOMCAT
  • 原文地址:https://blog.csdn.net/weixin_52721608/article/details/133433727