zoukankan      html  css  js  c++  java
  • spring 使用@Autowired注入与使用构造函数注入区别

    使用介绍

    1.@Autowired注入

    @RestController
    @RequestMapping("/test")
    public class TestController {
        @Autowired
        private List<TestService> testServices;
        @Autowired
        private List<ChainAsbtract> chains;
     
        private ChainAsbtract target;
     
    }
    

     

    2.构造器注入

    Spring4.3+之后,constructor注入支持非显示注入方式。

    @RestController
    @RequestMapping("/test")
    public class TestController {
    //    @Autowired
        private final List<TestService> testServices;
    //    @Autowired
        private final List<ChainAsbtract> chains;
     
    //    @Autowired
        public TestController(List<TestService> testServices, List<ChainAsbtract> chains) {
            this.testServices = testServices;
            this.chains = chains;
        }
     
        
    }
    

      

     3.setter注入

    @RestController
    @RequestMapping("/test")
    public class TestController {
    //    @Autowired
        private final List<TestService> testServices;
    //    @Autowired
        private final List<ChainAsbtract> chains;
     
        @Autowired
        public void setTestServices(List<TestService> testServices){
            this.testServices = testServices;
        }
     
        @Autowired
        public void setTestServices(List<ChainAsbtract> chains){
            this.chains = chains;
        }
        
    }
    

      事实上,spring在4.x版本后就推荐使用构造器的方式的来注入fileld

    官方推荐理由
    
    单一职责: 当使用构造函数注入的时候,你会很容易发现参数是否过多,这个时候需要考虑你这个类的职责是否过大,考虑拆分的问题;而当使用@Autowired注入field的时候,不容易发现问题
    
    依赖不可变: 只有使用构造函数注入才能注入final
    
    依赖隐藏:使用依赖注入容器意味着类不再对依赖对象负责,获取依赖对象的职责就从类抽离出来,IOC容器会帮你自动装备。这意味着它应该使用更明确清晰的公用接口方法或者构造器,这种方式就能很清晰的知道类需要什么和到底是使用setter还是构造器
    
    降低容器耦合度: 依赖注入框架的核心思想之一是托管类不应依赖于所使用的DI容器。换句话说,它应该只是一个普通的POJO,只要您将其传递给所有必需的依赖项,就可以独立地实例化。这样,您可以在单元测试中实例化它,而无需启动IOC容器并单独进行测试(使用一个可以进行集成测试的容器)。如果没有容器耦合,则可以将该类用作托管或非托管类,甚至可以切换到新的DI框架。
    

      

     另外,在使用构造器的使用能避免注入的依赖是空的情况。

    因为在bean的生命周期里面先执行的是bean的构造器,然后才给bean里面的属性赋值。

    转载自:https://blog.csdn.net/smilecjw/article/details/107669224

  • 相关阅读:
    风机故障诊断分析方案
    sklearn机器学习的监督学习的各个模型主要调参参数
    由于下载fiddler导致,有网而网页无法访问,解决方法是导入fiddler的代理证书,具体步骤参考下面博客
    主题建模:隐含狄利克雷分布
    pytorch坑
    sklearn学习总结
    C# 串口模拟键盘输入
    C#求 鸡兔同笼 已知鸡兔总头数,总脚数为x,求鸡兔各多少只?
    C#图像显示实现拖拽、锚点缩放功能[转 有耐心的小王]
    C# WinForm窗体及其控件自适应各种屏幕分辨率
  • 原文地址:https://www.cnblogs.com/qqq9527/p/14230169.html
Copyright © 2011-2022 走看看