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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值