Spring的三种注入方式
上一篇 /
下一篇 2012-07-19 09:33:23
/ 个人分类:杂谈
1、接口注入(不推荐)51Testing软件测试网/E;_3c!V$~$q,I O 2、getter,setter方式注入(比较常用)51Testing软件测试网d;N;]0h mV
Kw4x7Gyd+ag0 3、构造器注入(死的应用)
1p5}
M \|G051Testing软件测试网SA~?-z.c 关于getter和setter方式的注入
4gU%H3]7B!]6A|0- autowire="defualt"
- autowire=“byName”
- autowire="bytype"
|
51Testing软件测试网9K:d2e`m ^9M)E 详细解析注入方式
8ee%MPw%a4PE1R0A#{#d051Testing软件测试网7Uo
dk,z1p8K1IL/k 例如:有如下两个类需要注入51Testing软件测试网
O!S\{s{ i
`j.I.O.E5]?0 第一个类:51Testing软件测试网yIU&F;^R
- package org.jia;
-
- public class Order {
- private String orderNum;
- @SuppressWarnings("unused")
- private OrderItem orderitem;
-
- public OrderItem getOrderitem() {
- return orderitem;
- }
-
- public void setOrderitem(OrderItem orderitem) {
- this.orderitem = orderitem;
- }
-
- public String getOrderNum() {
- return orderNum;
- }
-
- public void setOrderNum(String orderNum) {
- this.orderNum = orderNum;
- }
- }
|
51Testing软件测试网Ky,F4b!z'g 第二个类:51Testing软件测试网FaU3K$Ve({(L3w
- package org.jia;
-
- public class OrderItem {
- private String orderdec;
-
- public String getOrderdec() {
- return orderdec;
- }
-
- public void setOrderdec(String orderdec) {
- this.orderdec = orderdec;
- }
- }
|
51Testing软件测试网3C{9T$}0nu%vAj 常用getter&&setter方式介绍51Testing软件测试网v,Q[/c0S+HKZtJ,D
51Testing软件测试网Z}rk6z 方式第一种注入:
0q)Y*m
aci&V0- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- 51Testing软件测试网-Zx8npYps~+T
- <beans>
- <bean id="orderItem" class="org.jia.OrderItem">
- <property name="orderdec" value="item00001"></property>
- </bean>
- <bean id="order" class="org.jia.Order" >
-
- <property name="orderNum" value="order000007"></property>
- <!--注入对象 名字为orderitem,所属的类的应用id为orderItem-->
- <property name="orderitem" ref="orderItem"></property>
-
- --></bean>
- </beans>
|
51Testing软件测试网2D7JG$x.i'U:F7YH D 方式第二种注入:byName
JO q%E1KZ]3H0- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!--此时的id就必须与Order.java中所定义的OrderItem的对象名称一样了,不然就会找不到-->
- <bean id="orderitem" class="org.jia.OrderItem">
- <property name="orderdec" value="item00001"></property>
- </bean>
- <bean id="order" class="org.jia.Order"<span style="color:#ff0000;"> autowire="byName"</span>>
- <property name="orderNum" value="order000007"></property>
- </bean>
- </beans>
[8FVX y+fT8l0 方式第三种注入:byType51Testing软件测试网$MqW4V5vT
51Testing软件测试网Zfs0w.Q/l@f`RV[$j_(c$m@0- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!--按照byType注入则就与id没有关系,可以随便定义id !!!但是不能出现多个此类的id-->
- <bean id="orderitdfadafaem" class="org.jia.OrderItem">
- <property name="orderdec" value="item00001"></property>
- </bean>
- <bean id="order" class="org.jia.Order" <span style="color:#ff0000;">autowire="byType"</span>>
- <property name="orderNum" value="order000007"></property>
- </bean>
- </beans>
|
_pB
FT U0 autowire="constructor"51Testing软件测试网0tuD5x
?M
51Testing软件测试网?-\"p)p"Lm1f"buS4j 需要在Order.java中加入一个构造器
%^ d8ab4c
i
LfLz01`:v(Wc&T#M0
uJs6Agby0- public Order(OrderItem item )
- {
- orderitem = item;
- }
|
Bzalp*Tn
x0 XML配置文件51Testing软件测试网2U
B9u${a
51Testing软件测试网"W'_0gJ0D6Fd*TwA)k!IxZ,Q6f0- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="orderItem" class="org.jia.OrderItem">
- <property name="orderdec" value="item00001"></property>
- </bean>
- <bean id="order" class="org.jia.Order" autowire="constructor">
- <property name="orderNum" value="order000007"></property>
- </bean>
- </beans>
|
51Testing软件测试网[${ MZ2cv Kw1SX 三种注入方式比较51Testing软件测试网~MH&m8?
51Testing软件测试网
b5V4SFp:S 接口注入:
]T*`C7q;Z,D#uO0u*o,G
B_:tnt}H7O0 接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
Z/SZ0C]i|-BF0
m[%\d$T"p*Mk;l0 Setter 注入:
"a|2B*Z*h+QI051Testing软件测试网#m!a7qo IsZ 对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。
y
E@'e:y~-W~051Testing软件测试网4?8MHy1V l)mc 如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。51Testing软件测试网A8\{
H GJ
51Testing软件测试网U5JeA,bi 如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
'u;]'eETu9t*o&j!v051Testing软件测试网0U[*rb.N$|m4O1^ R 构造器注入:
7l'b0MGLC4A,U051Testing软件测试网cHBX2HM K;UT?w 在构造期间完成一个完整的、合法的对象。51Testing软件测试网,f:E2[]y
cE&l?AA0 所有依赖关系在构造函数中集中呈现。51Testing软件测试网)e.p&c&`%[7a
51Testing软件测试网-nW^2pV%I1}a 依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。
OF'Y-l/Q@05nM4T/WWD#F0 只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。51Testing软件测试网6HNyZJNpH
51Testing软件测试网:u%@ \ Zx? I 总结
7uJ \.e1P051Testing软件测试网)jN
~!C|P Spring使用注入方式,为什么使用注入方式,这系列问题实际归结起来就是一句话,Spring的注入和IoC(本人关于IoC的阐述)反转控制是一回事。
rb'?(yXG051Testing软件测试网%PKm]Iom/s]X 理论上:第三种注入方式(构造函数注入)在符合java使用原则上更加合理,第二种注入方式(setter注入)作为补充。51Testing软件测试网r[:}
k4ug#iFEB
?C-N2ZJ1e0 实际上:我个人认为第二种注入方式(setter注入)可以取得更加直观的效果,在使用工作上有不可比拟的优势,所以setter注入依赖关系应用更加广泛。51Testing软件测试网
[#E/g^z
收藏
举报
TAG: