spring的factory-method和factory-bean分析
1:写在前面
这种方式是允许我们自己定义一个类,然后在该类中定义一个方法,在该方法中完成创建spring bean的工作,其中的factory-bean
用于指定自己定义的类,factory-method
用于指定创建bean的方法,另外创建对象的方法可以是静态的也可以是实例的。
2:例子
2.1:定义要创建的bean
public class Stu {
public String stuId;
public Stu(String stuId) {
this.stuId = stuId;
}
}
2.2:定义工厂bean
public class StuFactory {
static Map<String,Stu> stuMap = new HashMap<>();
static{
//初始化
Stream.iterate(1,n->n+1).limit(5).map(String::valueOf).forEach(t-> stuMap.put(t, new Stu(t)));
}
//静态创建类,方法必须是静态(static修饰)
public static Stu getStaticStu(String stuId){
return stuMap.get(stuId);
}
//动态创建类
public Stu getDynamicStu(String stuId){
return new Stu(stuId);
}
}
2.3:定义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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--静态获取对象-->
<bean id="staticStu" class="yudaosourcecode.factorymethod.StuFactory" factory-method="getStaticStu">
<!--传入getStaticStu方法的参数-->
<constructor-arg value="1"/>
</bean>
<!--生成对象的工厂-->
<bean id="stuFactory" class="yudaosourcecode.factorymethod.StuFactory"/>
<!--动态获取对象-->
<bean id="dynamicStu" factory-bean="stuFactory" factory-method="getDynamicStu">
<!--传入getDynamicStu方法的参数-->
<constructor-arg value="11"/>
</bean>
</beans>
2.4:测试
@Test
public void springFactoryMethodConfig() {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:springFactoryMethodConfig.xml");
//获取静态Bean
Stu staticStu = ac.getBean("staticStu", Stu.class);
System.out.println("staticStu: ");
System.out.println(staticStu);
//获取动态Bean
Stu dynamicStu = ac.getBean("dynamicStu", Stu.class);
System.out.println("dynamicStu: ");
System.out.println(dynamicStu);
}
运行:
staticStu:
yudaosourcecode.factorymethod.Stu@6ec8211c
dynamicStu:
yudaosourcecode.factorymethod.Stu@7276c8cd
Process finished with exit code 0
还没有评论,来说两句吧...