Spring——静态工厂方法、实例工厂方法创建 Bean ?

一、通过调用静态工厂方法创建 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

扫描二维码关注公众号,回复: 4129008 查看本文章
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

猜你喜欢

转载自blog.csdn.net/qq_42246139/article/details/82748069
今日推荐