六、spring之通过FactoryBean为ioc容器中添加组件

前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过FactoryBean添加组件的方法。

首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类

类Color:

// 不必关心该类的具体代码实现,我们只是要把它注册进容器中即可
public class Color {
    private Car car;
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    @Override
    public String toString() {
        return "Color [car=" + car + "]";
    }
}

如果呢,我们想要通过FactoryBean来为容器中添加组件,我们需要实现这个类。

首先来看下这个工厂bean的结构:

1005988-20190819203748933-1659579851.png

我们再来写个ColorFactoryBean类实现这个工厂Bean的接口

import org.springframework.beans.factory.FactoryBean;
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

    //返回一个Color对象,这个对象会添加到容器中
    @Override
    public Color getObject() throws Exception {
        System.out.println("ColorFactoryBean...getObject...");
        return new Color();
    }

    @Override
    public Class<?> getObjectType() {
        return Color.class;
    }

    //是单例?
    //true:这个bean是单实例,在容器中保存一份
    //false:多实例,每次获取都会创建一个新的bean;
    @Override
    public boolean isSingleton() {
        return false;
    }
}

这个类非常简单,我们最终的目的是要将Color这个类注册到容器中,但前提是ColorFactoryBean也在容器中。所以呢我们在配置中注册这个ColorFactoryBean

@Configuration
public class MainConfig2 {  
    /**
     * 4)、使用Spring提供的 FactoryBean(工厂Bean);
     *      1)、默认获取到的是工厂bean调用getObject创建的对象
     *      2)、要获取工厂Bean本身,我们需要给id前面加一个&
     *          &colorFactoryBean
     */
    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
}

我们编写一个测试方法进行测试

    @Test
    public void testImport(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
    
        //工厂Bean获取的是调用getObject创建的对象
        Object bean2 = applicationContext.getBean("colorFactoryBean"); // 获取colorFactoryBean
        Object bean3 = applicationContext.getBean("colorFactoryBean");
        System.out.println("bean的类型:"+bean2.getClass()); // 打印出具体的类型,观察控制台,实际是
        //Color这个类
        System.out.println(bean2 == bean3); // isSingleton返回的false所以不是单例的
        // 如何获取到工厂bean本身呢,加上&符号
        Object bean4 = applicationContext.getBean("&colorFactoryBean"); 
        System.out.println(bean4.getClass());
    }

打印结果:

ColorFactoryBean...getObject...
ColorFactoryBean...getObject...
bean的类型:class com.atguigu.bean.Color
false
class com.atguigu.bean.ColorFactoryBean

转载于:https://www.cnblogs.com/heliusKing/p/11379599.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值