Spring學習之路(2)——實例化bean的方式、屬性注入

IoC實例化bean的方式

  • 使用構造器
  • 靜態工廠方法實現實例化
  • 實例工廠方法實現實例化

UserBean

package cn.sdut.bean;

public class UserBean {

	private int id;
	private String username;
	private int age;
	
	public UserBean() {
		
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}

使用構造器

beans.xml

<bean id="user" class="cn.sdut.bean.UserBean"></bean>

Test測試類


		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //獲得UserBean對象
		UserBean user = (UserBean) context.getBean("user");
        //模擬從數據庫中取出數據
		user.setUsername("hydra");
		System.out.println(user.getUsername());
		UserBean user1 = (UserBean) context.getBean("user");
		//scope默認爲singleton
		System.out.println(user1.getUsername());

scope不設置,默認爲單例模式,兩個對象user和user1爲同一個對象。

 靜態工廠方法實例化

StaticBeanFactory

package cn.sdut.bean;

/**
 * UserBean對象的靜態工廠模式
 * @author DELL
 *
 */
public class StaticBeanFactory {

	public static UserBean createUser() {
		return new UserBean();
		
	}
}

beans.xml

factory-method是工廠方法,填寫的是StaticBeanFactory裏的方法

 <bean id="staticuser" class="cn.sdut.bean.StaticBeanFactory" factorymethod="createUser">
 </bean>

測試類 Test

BeanFactory在使用時,才實例化bean,如果此時配置文件有錯,則會產生裝配錯誤

 //延時創建,使用時創建
		BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
		
		UserBean user2 = (UserBean) factory.getBean("staticuser");
		user2.setUsername("Hydra");
		System.out.println(user2.getUsername());

實例工廠模式

UserBeanFactory

package cn.sdut.bean;

/**
 * 實例工廠
 * @author DELL
 *
 */
public class UserBeanFactory {

	public UserBean createUser() {
		return new UserBean();
	}
	
	
}

beans.xml

  <bean id="factory" class="cn.sdut.bean.UserBeanFactory"></bean>
  <bean id="insuser" factory-bean="factory" factory-method="createUser"></bean>

實例化工廠模式需要配置兩個bean,類似於

UserBeanFactory factory = new UserBeanFactory();

factory.createrUser();

測試類Test

//實例工廠模式
UserBean user3 = (UserBean) context.getBean("insuser");
user3.setAge(20);
System.out.println(user3.getAge());

bean注入的三種類型

  • 構造函數注入
    • 屬性值是通過構造函數的參數注入
  • 屬性注入
    • 屬性值是通過屬性的set方法注入
  • 接口注入
    • 與動態代理衝突,暫不考慮

構造函數注入

beans.xml

<bean id="zhangsan" class="cn.sdut.bean.UserBean">
  <constructor-arg index="0" type="int" value="5"></constructor-arg>
  <constructor-arg index="1" type="String" value="zhangsan"></constructor-arg>
  <constructor-arg index="2" type="int" value="21"></constructor-arg>         	
  <!-- <constructor-arg index="3" ref="group"></constructor-arg> -->
  <constructor-arg index="3"><ref bean="group"></ref></constructor-arg>
</bean>

構造方法必須與beans.xml一一對應。

<constructor-arg>標籤通過index、type、value進行構造函數注入。

index表示構造方法的參數索引值,從0開始,type爲數據類型,(自定義時可以用ref屬性或者ref標籤引入),value爲要注入的默認值。

屬性注入

          <bean id="ituser" class="cn.sdut.bean.UserBean" depends-on="group,dormitory">
          	<property name="group" ref="group"></property>
          	<property name="dormitory" ref="dormitory"></property>
          </bean>
          <bean id="group" class="cn.sdut.bean.Group">
          	<property name="id">
          		<value>1</value>
          	</property>
          	<property name="name">
          		<value>清華大學</value>
          	</property>
          	<property name="addr">
          		<value>北京</value>
          	</property>      	
          </bean>

屬性注入時,是通過set方法注入的,beans.xml通過porperty屬性來配置,name爲變量屬性名,value爲要注入的值。

集合屬性注入

  • list
  • set
  • map
  • props

Group中新增兩個屬性,List集合的

private List<String> classList;
private List<UserBean> userList;
	
	
	
	public List<UserBean> getUserList() {
		return userList;
	}

	public void setUserList(List<UserBean> userList) {
		this.userList = userList;
	}

	public List<String> getClassList() {
		return classList;
	}

	public void setClassList(List<String> classList) {
		this.classList = classList;
	}

beans.xml

<bean id="neu" class="cn.sdut.bean.Group">
          	<property name="id" value="66"></property>
          	<property name="name" value="bd"></property>
          	<property name="addr"> <value>it is a addr</value></property>
          	<property name="classList">
          		<list>
          			<value>java6班</value>
          			<value>java7班</value>
          			<value>java8班</value>
          		</list>
          	</property>
          	<property name="userList">
          		<list>
          			<ref bean="ituser" />
          		</list>
          	</property>
          </bean>

和其他的類似,基本數據類型用value,其他的用ref來注入,但是集合屬性的注入需要在value標籤外套上所屬的集合標籤

如上面的list,此外還有set,map,props。set和list用法相同,map和props使用的是鍵值對的方式來注入

<property name="map">
    <map>
        <entry key="key"><ref bean="user"/></entry>
    </map>
</property>
<property name="props">
    <props key="key1">value1</props>
    <props key="key2">value2</props>
</property>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章