• [Spring] 04 Denpendency Injection


      

    DI Dependency Injection 依赖注入:从程序代码中移除依赖关系的一种设计模式.

    这样就可以更容易地管理和测试应用程序.

    DI使我们的程序编码 loosely coupled.松耦合.

    为了更好地理解DI,先了解 Dependency Lookup (DL):

           Dependency Lookup 是按需获得资源的一种方式.(JNDI)

    缺点:

    复杂,依赖,不容易测试.

    依赖注入则是移除这种对于程序的依赖.

    这种情况下,我们可以从外部源中获取源,比如XML文件.

    这让代码松耦合,更容易测试.

    写成这样:

    只需要创建对象,然后是set方法和构造函数.

    但是个人实际测试中,不需要构造函数.只是通过property元素创建这个对象,确实不需要.但是如果依赖此类的类通过ref attribute或者<constructor-arg><ref bean="*"/>的话,就需要相应的构造函数了.

    class Employee{  
    Address address;  
      
    Employee(Address address){  
    this.address=address;  
    }  
    public void setAddress(Address address){  
    this.address=address;  
    }  
      
    }  

    这种情况下,Address的实例化由外部源(如XML文件) 提供,而不是由set方法或者构造函数完成.(个人简介:需要set方法,xml文件中的bean的name是需要和set方法对应的).

    Spring框架提供两种方式来注入依赖.

    构造函数

    Setter方法.

    --下面是构造函数的方法:

    在bean元素下通过constructor-arg子元素来给构造函数传入参数进行实例化, 这样的话,要求类中的构造函数与bean的参数列表一一对应.

    一种方法就是只输入value和type,让构造函数自己判断.

    一种是通过index来按照顺序注入,这样会对int和string等进行自动转换.

    还有一种需要使用name来指定参数名以避免混淆,比如构造函数中有两个相同类型参数的时候.

    如果不指定参数类型,只有一个value,默认会调用string类型的构造函数.

    ----对于List<T>,使用<list>元素.

    如果泛型是string类型的集合.则使用<list> <value>值</value>

    如果不是string,则使用<ref bean="bean_name_1">

    --对于Map<String,String>

    <constructor-arg>  
    <map>  
    <entry key="Java is a Programming Language"  value="Ajay Kumar"></entry>  
    <entry key="Java is a Platform" value="John Smith"></entry>  
    <entry key="Java is an Island" value="Raj Kumar"></entry>  
    </map>  
    </constructor-arg> 

    --对于Map<Object,Object>

    <constructor-arg>  
    <map>  
    <entry key-ref="answer1" value-ref="user1"></entry>  
    <entry key-ref="answer2" value-ref="user2"></entry>  
    </map>  
    </constructor-arg>

    ---bean的继承.bean标签内加入parent属性可以继承parent bean的属性.

    如果parent bean使用constructor-arg,child bean也要使用.

    property同理.

    --通过property子元素设置bean,就是setter方法注入.

    ---setter方法注入Collection<String>:

    --非String 的,就是在<list>等标签间加入<ref bean=""/>

    --Map<K,V>

    https://www.javatpoint.com/spring-tutorial-setter-injection-with-non-string-map

     -----------------------------------构造函数和setter注入的区别---------------

    1.部分依赖:可以通过setter注入,但是Constructor却不行(必须有对应参数列表的constructor).

    2.overriding: setting方法可以override构造函数注入. 如果我们使用两者,IOC容器会使用setter注入.

    3. changes: setter注入可以很容易地改变值(并不会创建一个新的bean实例),而constructor注入会创建一个新的bean实例.

    所以setter更灵活.

    宛如智障,暗藏锋芒
  • 相关阅读:
    Linux bash受限的shell(RESTRICTED SHELL) 规格严格
    Maven 打包生成source.jar源码 规格严格
    autoreconf: command not found 规格严格
    Unable to launch the Java Virtual Machine
    LISTAGG代替WM_CONCAT
    分析mybatis的#{}、${}(#绑定变量超过一定值导致Oracle挂掉)
    jar包和war包的区别
    excel导出大数据量时服务器cpu过高tomcat卡死问题排查
    佳颖医疗报销
    不忘初心,牢记使命
  • 原文地址:https://www.cnblogs.com/zienzir/p/9126031.html
Copyright © 2020-2023  润新知