• JAVA注解---2


    注解使用的三种方式:

    本文参考地址:https://www.cnblogs.com/chansblogs/p/8343930.html  感谢作者

    我们在使用依赖注入的时候,通常由三种方式:

    1.构造器注入

    2. 通过setter方法注入

    3. 通过field方式注入

    public class MyAutowired {
    
        @Autowired
        private Person persona;
    
        @Autowired
        private Person personb;
    
        @Autowired
        private Person personc;
    
        @Autowired
        public MyAutowired (Person a,Person b,Person c){
            persona = a;
            personb = b;
            personc = c;
        }
    
        @Autowired
        public void setPersonA(Person person){
            persona = person;
        }
    
        @Autowired
        public void setPersonB(Person person){
            personb = person;
        }
    
        @Autowired
        public void setPersonC(Person person){
            personc = person;
        }
    }

    三种方式的区别小结:

    1.基于constructor的注入,会固定依赖注入的顺序;该方式不允许我们创建bean对象之间的循环依赖关系,这种限制其实是一种利用构造器来注入的益处 - 当你甚至没有注意到使用setter注入的时候,Spring能解决循环依赖的问题;

    2.基于setter的注入,只有当对象是需要被注入的时候它才会帮助我们注入依赖,而不是在初始化的时候就注入;另一方面如果你使用基于constructor注入,CGLIB不能创建一个代理,迫使你使用基于接口的代理或虚拟的无参数构造函数。

    3.相信很多同学都选择使用直接在成员变量上写上注解来注入,正如我们所见,这种方式看起来非常好,精短,可读性高,不需要多余的代码,也方便维护;

    缺点:

    1.当我们利用constructor来注入的时候,比较明显的一个缺点就是:假如我们需要注入的对象特别多的时候,我们的构造器就会显得非常的冗余、不好看,非常影响美观和可读性,维护起来也较为困难;

    2.当我们选择setter方法来注入的时候,我们不能将对象设为final的;

    3.当我们在field变量上来实现注入的时候

        a.这样不符合JavaBean的规范,而且很有可能引起空指针;

        b.同时也不能将对象标为final的;

      c.类与DI容器高度耦合,我们不能在外部使用它;

        d.类不通过反射不能被实例化(例如单元测试中),你需要用DI容器去实例化它,这更像集成测试;

        ... etc.

  • 相关阅读:
    Linux的五个查找命令
    jquery mobile图片自适应屏幕
    JS定时刷新页面及跳转页面
    JavaScript-每隔5分钟执行一次ajax请求的实现方法
    jquerymobile-可折叠内容(Collapsible content)
    MVC入门教程-视图中的Layout使用
    如何利用 _ViewStart.cshtml对页面添加代码?
    检测到有潜在危险的Request.Form值
    varchar(n)和varchar(max)有什么区别
    报错:System.Data.Entity.Infrastructure.DbUpdateException 更新条目时出错
  • 原文地址:https://www.cnblogs.com/dousil/p/12868955.html
Copyright © 2020-2023  润新知