Spring4共提供了三種實例化bean的方式,分別爲構造器實例化、靜態工廠實例化、動態方法實例化,
下面一一詳解:文章出自這裏!
公用使用的實體
package com.gditc.test.domain;
/**
* 測試實體
*
* @author JiangI
*/
public class Person {
private String name;
private Integer age;
public Person() {
super();
System.out.println("無參構造器");
}
public Person(String name) {
super();
this.name = name;
System.out.println("帶name參數的構造器:" + name);
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
System.out.println("帶name及age參數的構造器" + name + ":" + age);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
方式一:
<!-- 實例化方式一:構造器 -->
<!-- 無參構造器實例化 -->
<bean id="personNo" class="com.gditc.test.domain.Person"/>
<!-- 帶name參數的構造器實例化 -->
<bean id="personWithName" class="com.gditc.test.domain.Person">
<constructor-arg name="name" value="username1"/>
</bean>
<!-- 帶name及age參數的構造器實例化 -->
<bean id="personWithNameAndAge" class="com.gditc.test.domain.Person">
<constructor-arg name="name" value="username2"/>
<constructor-arg name="age" value="22"/><!-- 注意這裏的value一定要和Person類屬性的age的類型一致,否則報錯 -->
</bean>
/**
* 無參構造器 正確運行條件:有一個無參構造器,否則報錯(無參構造器必須顯示寫出來)
*/
@Test
public void testPersonNo() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personNo");
System.out.println(person);
}
/*
* 帶name參數構造器
*/
@Test
public void testPersonWithName() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personWithName");
System.out.println(person);
}
/*
* 帶name及age參數構造器
*/
@Test
public void testPersonWithNameAndAge() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personWithNameAndAge");
<span style="white-space:pre"> </span>System.out.println(person);
}
方式二:靜態工廠
package com.gditc.test.domain;
/**
* 靜態工廠實例化
* @author JiangI
*
*/
public class PersonStaticFactory {
<span style="white-space:pre"> </span>//無參
public static Person createPersonInstance() {
return new Person();
}
//有參
public static Person createPersonInstance(String name) {
return new Person(name);
}
}
本工廠類提供兩個方法,分別對應帶參數、無參構造器。<!-- 實例化方式二:靜態工廠 -->
<!-- 無參數工廠創建方法 -->
<bean id="personStaticFactory" class="com.gditc.test.domain.PersonStaticFactory" factory-method="createPersonInstance"/>
<!-- 帶一參數工廠創建方法 -->
<bean id="personStaticFactoryWithName" class="com.gditc.test.domain.PersonStaticFactory" factory-method="createPersonInstance">
<span style="white-space:pre"> </span><constructor-arg name="name" value="username3"/>
</bean>
測試
/*
* 無參靜態工廠方法構造 (無論工廠方法是什麼修飾符都可以)
*/
@Test
public void testStaticFacotyNo() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personDynamicFactory");
System.out.println(person);
}
/*
*帶name參數工廠方法構造
*/
@Test
public void testStaticFacotyWithName() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personDynamicFactoryWithName");
System.out.println(person);
}
方式三:動態工廠
package com.gditc.test.domain;
/**
* 動態工廠
* @author JiangI
*
*/
public class PersonDynamicFactory {
//無參
public Person dynamicCreatePerson() {
return new Person();
}
//有參
public Person dynamicCreatePersonWithName(String name) {
return new Person(name);
}
}
<!-- 實例化方式三:動態工廠 -->
<!-- 無參數工廠創建方法 -->
<bean id="personDynamicFactory" class="com.gditc.test.domain.PersonDynamicFactory" factory-method="dynamicCreatePerson"/>
<!-- 帶一參數工廠創建方法 -->
<bean id="personDynamicFactoryWithName" class="com.gditc.test.domain.PersonDynamicFactory" factory-method="dynamicCreatePersonWithName">
<constructor-arg name="name" value="username4"/>
</bean>
測試
/*
* 無參動態工廠方法構造(無論工廠方法是什麼修飾符都可以)
*/
@Test
public void testDynamicFacoty() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personDynamicFactory");
System.out.println(person);
}
/*
* 帶name參數的工廠構造(無論工廠方法是什麼修飾符都可以)
*/
@Test
public void testDynamicFacotyWithName() {
Resource resource = new ClassPathResource("beans-instance.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);
Person person = (Person) beanFactory.getBean("personDynamicFactoryWithName");
System.out.println(person);
}
動態工廠實例化的方式出現錯誤,暫時找不到原因