Spring——靜態工廠方法、例項工廠方法建立 Bean ?
阿新 • • 發佈:2018-12-10
一、通過呼叫靜態工廠方法建立 bean:
利用靜態工廠方法可以把bean注入到IOC容器中。在XML檔案中配置bean時,要指定class的屬性為工廠的類;factory-method屬性指定工廠類中工廠方法,用於建立bean;constrctor-arg用於給工廠方法傳遞引數。
1、首先建立實體類Card.java
public class Card { /** * 編號 */ private String id; /** * 卡號 */ private String number; public Card() { super(); // TODO Auto-generated constructor stub } public Card(String id, String number) { super(); this.id = id; this.number = number; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "Card [id=" + id + ", number=" + number + "]"; }
2、接著建立靜態工廠的類StaticFactory.java
public class StaticFactory { // 建立map集合 public static Map<String, Card> map = new HashMap<>(); // 靜態載入 static { map.put("card1", new Card("11111", "12345")); map.put("card2", new Card("22222", "23456")); } // 獲取值的方法 public static Card getCard(String name) { return map.get(name); } }
3、接著建立applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> <!--class要寫工廠的類;factory-method要寫工廠類中用於建立bean的方法--> <bean id="card1" class="com.zking.spring01.factory.StaticFactory" factory-method="getCard"> <constructor-arg value="card1" /> </bean> </beans>
4、最後就是建立測試類TestAction.java
public class TestAction {
/**
*
* @Title: getBean
* @Description: 獲取一個bean
* @return void
*/
@org.junit.Test
public void getBean() {
// 2、及時載入,特點:初始化載入時,有多少個bean標籤,就建立多少個bean物件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//得到實體物件
Card card1 = (Card) applicationContext.getBean("card1");
System.out.println("編號:" + card1.getId() + " 卡號:" + card1.getNumber());
}
}
5、控制檯輸出的結果
編號:11111 卡號:12345
二、通過呼叫例項工廠方法建立 bean:
例項化靜態工廠注入bean,需要先例項化一個工廠類,然後通過由例項化工廠物件中的一個方法來建立bean,並注入到容器中。 在bean的 factory-bean 屬性裡指定擁有該工廠方法的 Bean;在 factory-method 屬性裡指定該工廠方法的名稱;使用 construtor-arg 元素為工廠方法傳遞方法引數。
1、建立實體類Card.java
2、建立例項工廠的類InstanceFactory.java
public class InstanceFactory {
// 建立map集合
private Map<String, Card> map = null;
// 例項載入
public InstanceFactory() {
map = new HashMap<>();
map.put("card1", new Card("11111", "12345"));
map.put("card2", new Card("22222", "23456"));
}
// 獲取值的方法
public Card getCard(String name) {
return map.get(name);
}
}
3、applicationContext.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<!--例項化工廠方法的注入 -->
<!-- 首先建立一個工廠的bean -->
<bean id="cardFactory"
class="com.zking.spring01.factory.InstanceFactory"></bean>
<!-- factory-bean指定前面已經建立的bean; factory-method指定工廠例項中用於建立car的方法; constructor-arg指定建立car方法中傳入的引數 -->
<bean id="card2" factory-bean="cardFactory"
factory-method="getCard">
<constructor-arg value="card2"></constructor-arg>
</bean>
</beans>
4、建立測試類TestAction.java
public class TestAction {
/**
*
* @Title: getBean
* @Description: 獲取一個bean
* @return void
*/
@org.junit.Test
public void getBean() {
// 2、及時載入,特點:初始化載入時,有多少個bean標籤,就建立多少個bean物件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Card card2 = (Card) applicationContext.getBean("card2");
// 得到card物件注入到測試表的屬性值
System.out.println("編號:" + card2.getId() + " 卡號:" + card2.getNumber());
}
}
5、控制檯輸出的結果
編號:22222 卡號:23456