spring的factory-method和factory-bean分析

爱被打了一巴掌 2022-10-23 04:59 183阅读 0赞

1:写在前面

这种方式是允许我们自己定义一个类,然后在该类中定义一个方法,在该方法中完成创建spring bean的工作,其中的factory-bean用于指定自己定义的类,factory-method用于指定创建bean的方法,另外创建对象的方法可以是静态的也可以是实例的。

2:例子

2.1:定义要创建的bean

  1. public class Stu {
  2. public String stuId;
  3. public Stu(String stuId) {
  4. this.stuId = stuId;
  5. }
  6. }

2.2:定义工厂bean

  1. public class StuFactory {
  2. static Map<String,Stu> stuMap = new HashMap<>();
  3. static{
  4. //初始化
  5. Stream.iterate(1,n->n+1).limit(5).map(String::valueOf).forEach(t-> stuMap.put(t, new Stu(t)));
  6. }
  7. //静态创建类,方法必须是静态(static修饰)
  8. public static Stu getStaticStu(String stuId){
  9. return stuMap.get(stuId);
  10. }
  11. //动态创建类
  12. public Stu getDynamicStu(String stuId){
  13. return new Stu(stuId);
  14. }
  15. }

2.3:定义xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <!--静态获取对象-->
  4. <bean id="staticStu" class="yudaosourcecode.factorymethod.StuFactory" factory-method="getStaticStu">
  5. <!--传入getStaticStu方法的参数-->
  6. <constructor-arg value="1"/>
  7. </bean>
  8. <!--生成对象的工厂-->
  9. <bean id="stuFactory" class="yudaosourcecode.factorymethod.StuFactory"/>
  10. <!--动态获取对象-->
  11. <bean id="dynamicStu" factory-bean="stuFactory" factory-method="getDynamicStu">
  12. <!--传入getDynamicStu方法的参数-->
  13. <constructor-arg value="11"/>
  14. </bean>
  15. </beans>

2.4:测试

  1. @Test
  2. public void springFactoryMethodConfig() {
  3. ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:springFactoryMethodConfig.xml");
  4. //获取静态Bean
  5. Stu staticStu = ac.getBean("staticStu", Stu.class);
  6. System.out.println("staticStu: ");
  7. System.out.println(staticStu);
  8. //获取动态Bean
  9. Stu dynamicStu = ac.getBean("dynamicStu", Stu.class);
  10. System.out.println("dynamicStu: ");
  11. System.out.println(dynamicStu);
  12. }

运行:

  1. staticStu:
  2. yudaosourcecode.factorymethod.Stu@6ec8211c
  3. dynamicStu:
  4. yudaosourcecode.factorymethod.Stu@7276c8cd
  5. Process finished with exit code 0

发表评论

表情:
评论列表 (有 0 条评论,183人围观)

还没有评论,来说两句吧...

相关阅读