Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean

1、知识点

(1)bean的创建默认就是框架利用反射new出来的bean实例;
(2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这个类就是工厂。
如:AirPlane ap = AirPlaneFactory.getAirPlane(String jzName);
(3)静态工厂:工厂本身不用创建对象;通过静态方法调用,对象 = 工厂类.工厂方法名();
(4)实例工厂:工厂本身需要创建对象;如下:
工厂类 工厂对象 = new 工厂类();
工厂对象.getAirPlane(“张三”);

2、创建工厂类

(1)创建静态工厂

public class AirPlaneStaticFactory {
//    静态工厂调用:AirPlaneStaticFactory.getAirPlane()
    public static AirPlane getAirPlane(String jzName){
        System.out.println("静态工厂正在运行。。。");
        AirPlane airPlane = new AirPlane();
        airPlane.setFdj("锤子");
        airPlane.setFjsName("天航");
        airPlane.setJzName(jzName);
        airPlane.setPersonNum(200);
        airPlane.setYc("200m");
        return airPlane;
    }
}

(2)创建实例工厂

public class AirPlaneInstanceFactory {
//    实例工厂调用:先new AirPlaneInstanceFactory(),再调用getAirPlane()
    public  AirPlane getAirPlane(String jzName){
        System.out.println("实例工厂正在运行。。。");
        AirPlane airPlane = new AirPlane();
        airPlane.setFdj("锤子");
        airPlane.setFjsName("天航");
        airPlane.setJzName(jzName);
        airPlane.setPersonNum(200);
        airPlane.setYc("200m");
        return airPlane;
    }
}

3、静态工厂使用(不需要创建工厂本身),factory-method指定哪个方法是工厂方法。

(1)class:指定工厂全类名
(2)factory-method:指定工厂方法
(3)constructor-arg:可以为方法传参

<bean id="airPlane" class="atguigu.factory.AirPlaneStaticFactory" factory-method="getAirPlane">
<!--       可以为方法指定参数-->
        <constructor-arg name="jzName" value="机长"></constructor-arg>
</bean>

4、实例工厂使用

(1)先创建一个实例工厂bean

<bean id="airPlaneInstanceFactory" class="atguigu.factory.AirPlaneInstanceFactory">
</bean>

(2)使用实例工厂
1)factory-bean:指定当前对象创建使用哪个工厂实例
2)factory-method:使用哪个工厂方法

<bean id="airPlane2" class="atguigu.bean.AirPlane" factory-bean="airPlaneInstanceFactory" factory-method="getAirPlane">
        <constructor-arg name="jzName" value="实例机长"></constructor-arg>
</bean>

(3)实例工厂使用步骤
1)先配置出实例工厂对象,如上述的(1)
2)配置我们要创建的AirPlane使用哪个工厂创建,如上述(2)

5、FactoryBean的使用

(1)知识点
1)FactoryBean是Spring规定的一个接口;只要是这个接口的实现类,Spring都认为是一个工厂。
2)实现了FactoryBean接口的类都是Spring可以认识的工厂类,Spring会自动的调用工厂方法创建实例
3)ioc容器启动时不会创建实例
4)FactoryBean:获取的时候才创建对象,即:ioc.getbean();

(2)FactoryBean的使用步骤
1)编写一个Factory的实现类
2)在Spring配置文件中进行注册

(3)编写一个Factory的实现类

//Book是一个实体类
public class MyFactoryBeanImpl implements FactoryBean<Book> {

    /**
     * getObject:工厂方法
     * 返回创建的对象
     * @return
     * @throws Exception
     */
    @Override
    public Book getObject() throws Exception {
        Book book = new Book();
        book.setBookName(UUID.randomUUID().toString());
        return book;
    }

    /**
     * 返回创建的对象的类型
     * Spring会自动调用该方法来确认创建的对象是什么类型
     * @return
     */
    @Override
    public Class<?> getObjectType() {
        return Book.class;
    }

    /**
     * isSingleton:是单例?
     * false:不是单实例
     * true:是单实例
     *
     * @return
     */
    @Override
    public boolean isSingleton() {
        return false;
    }
}

(4)在Spring配置文件中注册

<bean id="myFactoryBean" class="atguigu.factory.MyFactoryBeanImpl">
</bean>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值