有关依赖注入的学习,昨天在这篇文章中已经谈到了aop的前置增强和后置增强以及IoC的设值注入,不明白的朋友们可以点击链接跳到此篇去学习下,有代码示例。而此篇是来扩展学习下
springIoC的其他注入方式
以及注入的不同数据类型的标签使用
。
一、IoC扩展
1、构造注入
用法,即spring通过构造方法来赋值。在上面提到的那篇文章中使用的设值注入是Spring通过JavaBean的无参构造方法实例化对象。当我们在程序中编写了有参构造方法时,JVM就不会再提供默认的无参构造方法。建议自行为程序添加一个无参构造方法,为什么呢?这样做是为了保证使用的灵活性,你就可以同时通过Spring使用设值注入和构造注入。
具体操作步骤:先为要注入的类添加构造方法,再编写spring-cfg.xml配置文件,一个<constructor-arg>元素表示构造方法的一个参数,使用时不区分参数顺序。当构造方法参数有多个要区分时,可以使用<constructor-arg>的index属性指定参数的位置索引,索引从0开始。还可通过<constructor-arg>的子元素的type属性指定参数的类型,避免字符串和基本数据类型的混淆。
改造在上面引言提到的文章中打印机程序,A5Paper纸张通过Spring的构造注入方式。
修改部分代码如下:
一、在TextPaper类中加入以下构造方法。
//无参构造方法,用于方便设值注入的方式
public TextPaper(){
}
//构造方法,用于注入列数和行数
public TextPaper(int cols, int rows) {
this.cols = cols;
this.rows = rows;
}
二、修改spring-cfg.xml文件
<bean id="A5Paper" class="TextPaper">
<constructor-arg index="0">
<value type="int">10</value>
</constructor-arg>
<constructor-arg index="1">
<value type="int">7</value>
</constructor-arg>
</bean>
三、大功告成,程序结果打印正常。
构造注入与设值注入的区别:构造注入的时效性比设值注入好,在对象实例化时就得到所依赖的对象,便于在对象的初始化方法中使用依赖对象;但受限于方法重载的方式,使用的灵活性不足,设值注入的灵活性就相对较好。当然,Spring提供的注入方式绝不止这两种,只是这2种常用且简单,其他方式有兴趣的朋友可参考Spring开发手册了解。
(#^.^#)一起再额外学习一种吧
2、p命名空间注入
方式
p命名空间的特点是使用属性而不是子元素的形式来配置Bean的属性,从而简化Bean的配置。
注意:使用p命名空间注入时要先添加p命名空间的声明: xmlns:p="http://www.springframework.org/schema/p"
也可通过IDEA的快捷键 alt+enter
快速创建声明。
还是改造打印机程序,修改代码如下即可:
<bean id="A5Paper" class="TextPaper"
p:cols="15" p:rows="7"/>
二、注入不同的数据类型
1、注入直接量(基本数据类型,字符串)
可通过value属性或者通过<value>子元素进行注入。
若在XML文件中注入的属性值包含了XML中的特殊字符(&,<,>,",')这五个时,则注入时需要进行特殊处理。
有此两种解决方法:①使用<![CDATA[ ]]>标记 或 ②特殊字符替换为实体引用。
XML预定义的实体引用
符号 | 实体引用 |
---|---|
& | & |
> | > |
< | < |
" | "s; |
' | ' |
严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
方式①.png 方式②.png2、引用其他Bean组件
可通过ref属性或者通过<ref>子元素进行引用Bean。
<ref>子元素有bean属性和local属性,用法两者是一样的,都是用来指定Bean的id的。它们区别在于:使用local属性只能在同一个配置文件中检索Bean的id,而使用bean实现是可以在其他配置文件中检索id的。(O(∩_∩)O哈哈~ Spring配置文件是可以拆分的,这篇文章讲的不错。
3、使用内部Bean
如果一个Bean组件仅在一处使用,可以定义为内部Bean。就是在Bean组件中嵌套Bean,此时内部Bean只能给包裹它的Bean使用而已。
4、注入集合类型的属性
使用<list>标签注入List集合类型或者数组类型
使用<set>标签注入Set集合类型
使用<entry>标签注入Map集合类型,内部是<key><value>键值对标签
使用<props>标签注入Properties类型,内部是<prop>标签
网友评论