易学笔记--第1章:spring注入/1.2 依赖注入

第1章:spring注入/1.2 依赖注入/1.2.1 setting注入/1.2.1.1 概念

  • 概念
  1. setting注入指的是在Bean创建完成后,spring容器根据XML定义的属性名字,比如:roperty name="属性名字",然后找到该Bean中对应的setter方法进行注入

第1章:spring注入/1.2 依赖注入/1.2.1 setting注入/1.2.1.2 实例

  • 实例举例

 

  1. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.4 属性定义:属性值为其它Bean
  2. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.5 属性定义:属性值为基本类型:string/int/float/boolean等
  3. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.6 属性定义:属性值为数组
  4. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.7 属性定义:属性值为列表list
  5. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.8 属性定义:属性值为map
  6. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.9 属性定义:属性值为Set
  7. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.10 属性定义:属性值为Properties

第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.0 目录

  1. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.1 概念
  2. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.1 不指定下标:配置bean
  3. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.2 不指定下标:配置基本类型
  4. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.3 不指定下标:配置复杂类型
  5. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.4 指定下标:配置bean
  6. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.5 指定下标:配置基本类型
  7. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.6 指定下标:配置复杂类型
  8. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.1 循环依赖产生
  9. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.2 循环依赖解决
  10. 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.4 构造方法注入实例源代码(Maven工程,已编译通过)

第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.1 概念

  • 概念
  1. 指的是在实例化bean的时候,其构造方法需要传入相关的参数,而这个参数可以通过引入其他Bean或者基本类型或者复杂类型的数据进行初始化

第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.1  不指定下标:配置bean

  • 不指定下标:配置bean

 

    • 格式:

      <bean id="bean名称" class="含包名的类名">

            <constructor-arg ref="其它bean的名称"/>

         </bean>

    • 说明: bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
    • 举例:
      1. 构造方法定义:

        public AccountServiceImpl(AccountDao accountDao) {

                   this.accountDao = accountDao;

             }

      2. XML配置:

        <bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">

                   <!-- 构造方法的参数是引用其它的bean -->

                   <constructor-arg ref="accountDao" />

             </bean>

             <!-- 被应用的bean -->

             <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">

             </bean>


第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.2  不指定下标:配置基本类型

  • 不指定下标:配置基本类型

 

    • 格式:

      <bean id="bean名称" class="含包名的类名 ">

            <constructor-arg value="基本类型"/>

         </bean>

    • 说明:
      1. bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
      2. 基本类型:都表现为字符串,spring会自动转换为相应类型,支持的基本类型参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.5 属性定义:属性值为基本类型:string/int/float/boolean等
    • 举例:
      1. 构造方法:

        public AccountServiceImpl(int nTest){

                   System.out.println("nTest="+nTest);

             }

      2. XML配置:

         <bean id="accountService2" class="com.wiley.beginningspring.ch2.AccountServiceImpl">

                   <!-- 构造方法的参数是基本类型-->

                   <constructor-arg value="100" />

             </bean>


第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.3  不指定下标:配置复杂类型

  • 不指定下标:配置复杂类型

 

    • 格式:

      <bean id="bean名称" class="含包名的类名 ">

            <constructor-arg>

               <map></map>

                 或者

      <list></ list >

                 或者

      <Set></Set>

            </constructor-arg>

         </bean>

    • 说明:
      1. bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
      2. 复杂类型的赋值格式参数:
        1. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.6 属性定义:属性值为数组
        2. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.7 属性定义:属性值为列表list
        3. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.8 属性定义:属性值为map
        4. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.9 属性定义:属性值为Set
        5. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.10 属性定义:属性值为Properties
    • 举例:
      1. 构造方法:

        public AccountServiceImpl(Map<Long, String> map){

                   System.out.println(map);

             }

      2. XML文件配置:

             <bean id="accountService3" class="com.wiley.beginningspring.ch2.AccountServiceImpl">

                   <constructor-arg>

                        <map>

                             <entry key="1" value="test1"></entry>

                             <entry key="2" value="test2"></entry>

                        </map>

                   </constructor-arg>

             </bean>


第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.4  指定下标:配置bean

  • 指定下标:配置bean

 

    • 格式:

      <bean id="bean名称" class="含包名的类名">

            <constructor-arg ref="其它bean的名称" index= 0/>

            <constructor-arg ref="其它bean的名称" index= 1/>

         </bean>

    • 说明:
      1. bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
      2. index:表示构造方法的参数位置,从0开始
    • 举例:
      1. 构造方法:

        //构造方法1,匹配XML中的配置

             public Foo(Bar bar, Baz baz) {

                   this.bar = bar;

                   this.baz = baz;

             }

             //构造方法2,不匹配XML中的配置

             public Foo(Baz baz, Bar bar) {

                   this.bar = bar;

                   this.baz = baz;

             }

      2. XML中配置:

        <bean id="foo" class="com.wiley.beginningspring.ch2.Foo">

                   <!-- 指明构造方法的参数顺序:第1的位置是 bar对应的bean -->

                   <constructor-arg ref="bar" index="0" />

                   <!-- 指明构造方法的参数顺序:第2的位置是 baz对应的bean -->

                   <constructor-arg ref="baz" index="1" />

             </bean>

             <bean id="bar" class="com.wiley.beginningspring.ch2.Bar" />

             <bean id="baz" class="com.wiley.beginningspring.ch2.Baz" />


第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.5  指定下标:配置基本类型

  • 指定下标:配置基本类型

 

    • 格式:

      <bean id="bean名称" class="含包名的类名">

            <constructor-arg value="值1" index= 0/>

            <constructor-arg value="值2" index= 1/>

       </bean>

    • 说明:
      1. bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
      2. 基本类型:都表现为字符串,spring会自动转换为相应类型,支持的基本类型参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.5 属性定义:属性值为基本类型:string/int/float/boolean等
      3. index:表示构造方法的参数位置,从0开始
    • 举例:
      1. 构造方法:

        public Foo(float f,int n) {

                   System.out.println("f="+f);

                   System.out.println("n="+n);

             }

      2. XML文件中配置:

        <bean id="foo3" class="com.wiley.beginningspring.ch2.Foo">

                   <!-- 指明构造方法的参数顺序:第2的位置是100.00 -->

                   <constructor-arg value="100" index = "1"/>

                   <!-- 指明构造方法的参数顺序:第1的位置是200.00 -->

                   <constructor-arg value="200.00" index="0" />

             </bean>


第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.6  指定下标:配置复杂类型

  • 指定下标:配置复杂类型

 

    • 格式:

      <bean id="bean名称" class="含包名的类名">

            <constructor-arg index= "0"/>

                 <constructor-arg>

                   <map></map>

                      或者

      <list></ list >

                     或者

      <Set></Set>

              </constructor-arg>

             <constructor-arg index= "1"/>

                 <constructor-arg>

                   <map></map>

                      或者

      <list></ list >

                     或者

      <Set></Set>

              </constructor-arg>

       </bean>

    • 说明:
      1. bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
      2. 复杂类型的赋值格式参数:
        1. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.6 属性定义:属性值为数组
        2. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.7 属性定义:属性值为列表list
        3. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.8 属性定义:属性值为map
        4. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.9 属性定义:属性值为Set
        5. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.10 属性定义:属性值为Properties
      3. index:表示构造方法的参数位置,从0开始
    • 举例:
      1. 构造方法:

        public Foo(Map<Long,String> map,List<String> list) {

                   System.out.println("map="+map);

                   System.out.println("list="+list);

             }

      2. XML文件配置:

        <bean id="foo4" class="com.wiley.beginningspring.ch2.Foo">

                   <!-- 第一个参数类型为:map -->

                   <constructor-arg index="0">

                        <map>

                             <entry key="1" value="test1"></entry>

                             <entry key="2" value="test2"></entry>

                        </map>

                   </constructor-arg>

                   <!-- 第二个参数类型为:list -->

                   <constructor-arg index="1">

                        <list>

                             <value>list1</value>

                             <value>list2</value>

                             <value>list3</value>

                        </list>

                   </constructor-arg>

             </bean>


第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.1 循环依赖产生

  • 循环依赖产生

 

    • 指的是是在构造方法中,参数Bean之间相互依赖
    • 举例:A类(
      package com.wiley.beginningspring.ch2;
      
      
      public class A {
      	private B b;
      
      	public A(B b) {
      		this.b = b;
      	}
      }
      
      )的构造方法参数是B类,而B类(
      package com.wiley.beginningspring.ch2;
      
      public class B {
      	private A a;
      
      	public B(A a) {
      		this.a = a;
      	}
      }
      
      )的构造方法参数又是A类,则两者之间是相互依赖的,当A类被初始化时需要先初始化B,而初始化B时又发现需要初始化A,这样就形成了相互依赖

第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.2 循环依赖解决

  • 循环依赖解决

 

  1. 对于循环依赖,建议通过setter注入( 第1章:spring注入/1.2 依赖注入/1.2.1 setting注入/1.2.1.2 实例) 进行解决,也就是A类的Bean初始化依然保留构造方法注入,而B类的Bean初始化修改为不依赖A类的Bean,而是修改为setter注入

第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.4  实例完整源代码

  • 构造方法注入实例源代码(Maven工程,已编译通过)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易学笔记(qq:1776565180)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值