版权声明:本文为博主原创文章,未经博主允许不得转载。 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的实现类,这个大部分都是用于代理对象。 用法值得再深入了解一下