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