通过工厂方法配置bean
通过指向静态工厂的全类名,及factory-method,传入参数获取bean。
配置为:
<bean id="schoolBean" class="com.pfSoft.beanFactory.myFactory" factory-method="getSchool"> <constructor-arg value="wuda"></constructor-arg> </bean>
新增静态工厂类:
public class myFactory { private static Map<String, School> schools=new HashMap<String, School>(); static{ schools.put("wuda", new School("武大", "武汉东湖之滨")); schools.put("qinghua", new School("清华", "海淀黄庄")); } public static School getSchool(String schoolName) { return schools.get(schoolName); } }
新增 bean:school
public class School { private String schoolName; private String address; /** * * @return the schoolName */ public String getSchoolName() { return schoolName; } /** * @param schoolName the schoolName to set */ public void setSchoolName(String schoolName) { this.schoolName = schoolName; } /** * * @return the address */ public String getAddress() { return address; } /** * @param address the address to set */ public void setAddress(String address) { this.address = address; } public School(String schoolName, String address) { super(); this.schoolName = schoolName; this.address = address; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "School [schoolName=" + schoolName + ", address=" + address + "]"; } }
测试代码:
private ApplicationContext ctx; @Before public void init() { ctx=new ClassPathXmlApplicationContext("spring-beanFactory.xml"); } @Test public void testBeanStaticFactory() { School school= (School) ctx.getBean("schoolBean"); System.out.println(school.toString()); }
输出为:School [schoolName=武大, address=武汉东湖之滨]
实例工厂方法
有别与静态工厂方法,想要调用需要先创建工厂本身的实例来返回bean的实例。
在本例中需要先配置工厂的实例。
配置如下:
<bean id="instanceFactoryBean" class="com.pfSoft.beanFactory.InstanceFactory"></bean> <bean id="schoolBean2" factory-bean="instanceFactoryBean" factory-method="getSchool"> <constructor-arg value="qinghua"></constructor-arg> </bean>
实例工厂代码如下:
public class InstanceFactory { private Map<String, School> schools=new HashMap<String, School>(); public InstanceFactory() { schools.put("wuda", new School("武大", "武汉东湖之滨")); schools.put("qinghua", new School("清华", "海淀黄庄")); } public School getSchool(String schoolName) { return schools.get(schoolName); } }
测试代码如下:
@Test public void testBeanStaticFactory() { School school= (School) ctx.getBean("schoolBean"); School school2= (School) ctx.getBean("schoolBean2"); System.out.println(school.toString()); System.out.println(school2.toString()); }
输出结果为:
School [schoolName=武大, address=武汉东湖之滨]
School [schoolName=清华, address=海淀黄庄]
可以看到school2是通过实例工厂创建出来的。