版權聲明:本文為博主原創文章,如需轉載請標注轉載地址。
博客地址:http://www.cnblogs.com/caoyc/p/5619525.html
Spring bean提供了3中注入方式:屬性注入和構造方法注入
1、屬性注入:
1 <bean id="dept" class="com.proc.bean.Dept"> 2 <property name="id" value="2"/> 3 <property name="name" value="信息部"></property> 4 </bean>
屬性注入方式,要求屬性提供呢setXxx方法。上面提供的是普通屬性注入,如果要注入對象屬性,可以這樣
1 <bean id="user" class="com.proc.bean.User"> 2 <property name="id" value="1" /> 3 <property name="username" value="caoyc"></property> 4 <property name="dept" ref="dept"></property> 5 </bean>
我們看到第三個屬性dept,是一個Dept類型的屬性,可以通過ref來引用一個已定義的Dept類型的dept對象。
1 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); 2 User user=context.getBean("user", User.class); 3 System.out.println(user.getUsername()); 4 System.out.println(user.getDept().getName());
結果我們可以看到
caoyc
信息部
除了可以使用ref來引用外部對象外,我們也可以在user對象內部聲明一個Dept對象
1 <bean id="user" class="com.proc.bean.User"> 2 <property name="id" value="1" /> 3 <property name="username" value="caoyc"></property> 4 <property name="dept"> 5 <bean class="com.proc.bean.Dept"> 6 <property name="id" value="2"/> 7 <property name="name" value="信息部"></property> 8 </bean> 9 </property> 10 </bean>
2、使用構造器注入
假如,有一個User類
package com.proc.bean; public class User { private int id; private String username; private int age; private double slary; public User() { } public User(int id, String username) { this.id = id; this.username = username; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", age=" + age + ", slary=" + slary + "]"; } }
<bean id="user" class="com.proc.bean.User"> <constructor-arg value="1"/> <constructor-arg value="caoyc"/> </bean>
這里使用的是: public User(int id, String username)構造方式
這里使用的是下標方式,這里省略了index屬性。index屬性從0開始。上面的代碼相當於
1 <bean id="user" class="com.proc.bean.User"> 2 <constructor-arg index="0" value="1"/> 3 <constructor-arg index="1" value="caoyc"/> 4 </bean>
假設有這樣的兩個構造方式
1 public User(int id, String username, int age) { 2 this.id = id; 3 this.username = username; 4 this.age = age; 5 } 6 public User(int id, String username, double slary) { 7 this.id = id; 8 this.username = username; 9 this.slary = slary; 10 }
配置bean
1 <bean id="user" class="com.proc.bean.User"> 2 <constructor-arg index="0" value="1" /> 3 <constructor-arg index="1" value="caoyc"/> 4 <constructor-arg index="2" value="18"/> 5 </bean> 6 7 <bean id="user2" class="com.proc.bean.User"> 8 <constructor-arg index="0" value="1" /> 9 <constructor-arg index="1" value="caoyc"/> 10 <constructor-arg index="2" value="1800"/> 11 </bean>
測試代碼
1 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); 2 User user=context.getBean("user",User.class); 3 System.out.println(user); 4 5 User user2=context.getBean("user2",User.class); 6 System.out.println(user2);
輸出結果
1 User [id=1, username=caoyc, age=0, slary=18.0] 2 User [id=1, username=caoyc, age=0, slary=1800.0]
這里都是調用的public User(int id, String username, double slary)這個構造函數。那么怎么調用public User(int id, String username, int age)這個構造函數呢?
方法是,在這里我們需要使用到type屬性,來指定參數的具體類型
1 <bean id="user" class="com.proc.bean.User"> 2 <constructor-arg index="0" value="1" /> 3 <constructor-arg index="1" value="caoyc"/> 4 <constructor-arg index="2" value="18" type="int"/> 5 </bean>
輸出結果
1 User [id=1, username=caoyc, age=18, slary=0.0] 2 User [id=1, username=caoyc, age=0, slary=1800.0]
【其它說明】
1、如果value屬性是基本屬性直接使用
2、如果valeu屬性是其它類型,需要使用ref引用外部類型或使用內部定義方式
3、如果value屬性中包含了xml特殊字符,需要使用CDATA來。例如:
1 <constructor-arg index="1"> 2 <value><![CDATA[<caoyc>]]></value> 3 </constructor-arg>
