【Spring注解系列06】FactoryBean注入对象用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_37107022/article/details/88983274

使用Spring提供的 FactoryBean(工厂Bean);
1)、默认获取到的是工厂bean调用getObject创建的对象
2)、要获取工厂Bean本身,我们需要给id前面加一个&
         &colorFactoryBean


实例类与配置类

public class Color {
}

//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

    @Nullable
    @Override
    public Color getObject() throws Exception {
        System.out.println("ImportBeanByFactoryBean...............getObject");
        return new Color();
    }

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

    //是否为单例,默认为true,单实例。false表示为多实例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

@Configuration
public class FactoryBeanConfig {

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

测试

public class FactoryBeanTest {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(FactoryBeanConfig.class);

        //bean1看到的好像是ColorFactoryBean,实际上是Color的bean
        Object bean1 = applicationContext.getBean("colorFactoryBean");
        Object bean2 = applicationContext.getBean("colorFactoryBean");
        System.out.println(bean1);
        System.out.println(bean1==bean2);//设置为isSingleton返回值为true时,为单例

        //获取ColorFactoryBean本身
        ColorFactoryBean colorFactoryBean = (ColorFactoryBean) applicationContext.getBean("&colorFactoryBean");
        System.out.println(colorFactoryBean);

    }
}


结果:
ImportBeanByFactoryBean...............getObject //调用factoryBean的getObject方法
com.java.model.Color@2df32bf7 //注入对象实际为Color,而不是ColorFactoryBean
true //单例相同
com.java.model.ColorFactoryBean@530612ba //获取本身

个人觉得FactoryBean没什么作用,既然要单独注入Factorybean的实现类,为什么不直接注入要注入的对象呢?

Spring底层好像有大量应用。

查看了一下FactoryBean的实现类,这个大部分都是用于代理对象。 用法值得再深入了解一下

猜你喜欢

转载自blog.csdn.net/baidu_37107022/article/details/88983274
今日推荐