第1章:spring注入/1.2 依赖注入/1.2.1 setting注入/1.2.1.1 概念
- 概念
- setting注入指的是在Bean创建完成后,spring容器根据XML定义的属性名字,比如:roperty name="属性名字",然后找到该Bean中对应的setter方法进行注入
第1章:spring注入/1.2 依赖注入/1.2.1 setting注入/1.2.1.2 实例
- 实例举例
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.4 属性定义:属性值为其它Bean
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.5 属性定义:属性值为基本类型:string/int/float/boolean等
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.6 属性定义:属性值为数组
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.7 属性定义:属性值为列表list
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.8 属性定义:属性值为map
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.9 属性定义:属性值为Set
- 第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章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.1 概念
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.1 不指定下标:配置bean
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.2 不指定下标:配置基本类型
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.3 不指定下标:配置复杂类型
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.4 指定下标:配置bean
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.5 指定下标:配置基本类型
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.2 XML配置/1.2.2.2.6 指定下标:配置复杂类型
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.1 循环依赖产生
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.2 循环依赖解决
- 第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.4 构造方法注入实例源代码(Maven工程,已编译通过)
第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.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的定义
- 举例:
- 构造方法定义:
public AccountServiceImpl(AccountDao accountDao) {
this.accountDao = accountDao;
}
- 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>
- 说明:
- bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
- 基本类型:都表现为字符串,spring会自动转换为相应类型,支持的基本类型参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.5 属性定义:属性值为基本类型:string/int/float/boolean等
- 举例:
- 构造方法:
public AccountServiceImpl(int nTest){
System.out.println("nTest="+nTest);
}
- 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>
- 说明:
- bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
- 复杂类型的赋值格式参数:
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.6 属性定义:属性值为数组
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.7 属性定义:属性值为列表list
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.8 属性定义:属性值为map
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.9 属性定义:属性值为Set
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.10 属性定义:属性值为Properties
- 举例:
- 构造方法:
public AccountServiceImpl(Map<Long, String> map){
System.out.println(map);
}
- 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>
- 说明:
- bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
- index:表示构造方法的参数位置,从0开始
- 举例:
- 构造方法:
//构造方法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;
}
- 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>
- 说明:
- bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
- 基本类型:都表现为字符串,spring会自动转换为相应类型,支持的基本类型参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.5 属性定义:属性值为基本类型:string/int/float/boolean等
- index:表示构造方法的参数位置,从0开始
- 举例:
- 构造方法:
public Foo(float f,int n) {
System.out.println("f="+f);
System.out.println("n="+n);
}
- 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>
- 说明:
- bean名称、含包名的类名 参照: 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.3 Bean的定义
- 复杂类型的赋值格式参数:
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.6 属性定义:属性值为数组
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.7 属性定义:属性值为列表list
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.8 属性定义:属性值为map
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.9 属性定义:属性值为Set
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.10 属性定义:属性值为Properties
- index:表示构造方法的参数位置,从0开始
- 举例:
- 构造方法:
public Foo(Map<Long,String> map,List<String> list) {
System.out.println("map="+map);
System.out.println("list="+list);
}
- 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类(
)的构造方法参数是B类,而B类(package com.wiley.beginningspring.ch2; public class A { private B b; public A(B b) { this.b = b; } }
)的构造方法参数又是A类,则两者之间是相互依赖的,当A类被初始化时需要先初始化B,而初始化B时又发现需要初始化A,这样就形成了相互依赖package com.wiley.beginningspring.ch2; public class B { private A a; public B(A a) { this.a = a; } }
第1章:spring注入/1.2 依赖注入/1.2.2 构造方法注入/1.2.2.3 循环依赖问题/1.2.2.3.2 循环依赖解决
- 循环依赖解决
- 对于循环依赖,建议通过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工程,已编译通过)