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>