spring4.x(七)之第五章--注入参数详解及方法注入
1. 注入参数详解
-
字面值: 字面值一般指可用字符串表示的值,这些值可以通过元素标签进行注入。
默认情况下,基本数据类型及其封装类,String等类型都可以采取字面值注入的方式。
Spring容器在内部为字面值提供了编辑器,可将以字符串表示的字面值转换为内部变量的相应类型。允许注册自定义的编辑器- xml 中的特殊字符:
&
,<
,>
,"
,'
- 解决方法:
- 使用
<![CDATA[ ]]>
特殊标签将特殊字符包含起来 - 使用 XML 转义序列表示这些特殊字符
注: xml 解析器会忽略元素标签内部字符串前后空格,但spring不会忽略。
- xml 中的特殊字符:
-
引用其他Bean:
<ref>
元素可以通过以下3个属性引用容器中的其他Bean : -
内部Bean: 如果carBean只被bossBean引用,而不被容器中任何其他的Bean引用,则可以将car以内部Bean的方式注入Boss中
-
null值: 为属性设置一个null的注入值,必须使用
<null />
元素标签
<property name="brand"><null/></property>
<!--而不是-->
<property name="brand"><value></value></property> -
级联属性: 在定义Boss时直接为Car的属性提供注入值
为car属性声明一个初始化对象
注: ① 处如果没有实例化,那 spring 在设置级联属性时将抛出 NullValueInNestedPathException 异常 -
集合类型属性
-
List 与 Set:
对应的配置为 : -
Map :
假如某一Map元素的键和值都是对象,可以采用以下配置方式 : -
Properties: Properties类型可以看做Map的特例。Map的键和值可以是任何类型的对象,而Properties属性的键和值只能是字符串
-
集合合并 : Spring支持集合合并的功能,允许子
<bean>
继承父<bean>
的同名属性集合元素,并将子<bean>
中配置的集合属性值和父<bean>
中配置的同名属性值合并起来作为最终Bean的属性值
merge=”true”指示子和父中同名属性值进行合并,子Bean的favorites集合有5个元素。 -
通过util命名空间配置集合类型的Bean: 如果希望配置一个集合类型的Bean,而非一个集合类型的属性,可以通过util命名空间进行配置,首先需要在Spring配置头文件中引入util命名空间的声明
然后配置一个List类型的Bean,可以通过list-class显式指定List的实现类:支持value-type属性,指定集合中的值类型
配置一个Set类型的Bean,可以通过set-class显式指定Set的实现类:支持value-type属性,指定集合中的值类型
配置一个Map类型的Bean,可以通过map-class显式指定Map的实现类:支持key-type和value-type属性,指定Map的键和值类型
-
List 与 Set:
-
简化配置方式
注: 使用简化的方式,无法使用<![CDATA[]]>
处理XML特殊字符,只能使用XML转义序列对特殊字符进行转换
注:<ref>
的简化形式对应于<ref bean=”xxx”>
而<ref parent=”xxx”>
和<ref local=”xxx”>
没有对应的简化形式
3.使用p命名空间 :
注: 因为p命名空间中的属性名是可变的,所以p命名空间没有对应的Schema定义文件,也就无须在xsi:schemaLocation
中为p命名空间指定Schema定义文件 -
自动装配:
<bean>
元素提供了一个指定自动装配类型的属性:autowire=”<自动装配类型>”
注: 在实际开发中,XML 配置方式很少启用自动装配功能,而基于注解的配置方式默认采用 byType 自动装配策略。
2. 方法注入:(要将 CGLib 类包加入到类路径中)
-
lookup方法注入: Spring IoC容器拥有复写Bean方法的能力,这功能归功于CGLib类包。 CGLib 可以在运行期动态操作Class字节码,为Bean动态创建子类或实现类。
现在声明一个MagicBoss接口,并声明一个getCar()的接口方法。
通过配置为该接口提供动态的实现,让getCar()接口方法每次都返回新的carBean:
通过lookup-method元素标签为MagicBoss的getCar()提供动态实现,返回prototype类型的car Bean,这样Spring将在运行期为MagicBoss接口提供动态实现,效果等同于:
每次调用MagicBoss的getCar()方法都会从容器中获取car Bean,由于car Bean的作用域是prototype,所以每次都返回新的car实例。
looup方法注入,一般在希望通过一个singleton Bean获取一个prototype Bean时使用 -
方法替换: 用于替换别的Bean必须实现
MethodReplacer接口
,Spring利用该接口的方法替换目标Bean的方法。