什么是FactoryBean?别动不动就比较它和BeanFactory的区别,很显然前者是一个bean,而后者是一个是factory。既然是一个bean,又是在spring中,差不多很可能就是用来创建bean的,bean最后还是要进factory的。下来看下FactoryBean接口信息。

public interface FactoryBean<T{
  @Nullable
  getObject() throws Exception;
  @Nullable
  Class<?> getObjectType();
  default boolean isSingleton() {
    return true;
  }
}

接口比较简单,有两个待实现的方法分别用来返回实例对象和对象类型,一个返回true的默认单实例方法。下面通过FactoryBean来实例化自己的bean。

import org.springframework.beans.factory.FactoryBean;
public class 
BirdFactoryBean implements FactoryBean<Bird{
  @Override
  public Bird getObject() {
    return new Bird();
  }
  @Override
  public Class<?> getObjectType() {
    return Bird.class;
  }
}
class Bird{
}

就用FactoryBean返回一只鸟,然后把BirdFactoryBean进行实例化,采用古老的方式@Bean。

@Bean
public BirdFactoryBean 
birdFactoryBean(){
  return new BirdFactoryBean();
}

我们知道通过注解@Bean创建的bean默认的name是方法名,下面使用方法名来获取bean对象,看看拿到的是什么。

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
Object o1 = applicationContext.getBean("
birdFactoryBean");
System.out.println(o1.getClass());
--class com.star.model.Bird
Object o2 = applicationContext.getBean("&
birdFactoryBean");
System.out.println(o2.getClass());
--class com.star.condition.
BirdFactoryBean

可以看到直接使用beanName获取得到的是自定义FactoryBean的getObject方法返回的实例,而使用&beanName获取得到的是FactoryBean自身。当然这里也可以直接通过类型获取目标对象,&是spring指定的前缀,这里的beanName间接引用(dereference)了目标对象。源代码也比较清晰,打个断点一目了然。

通过FactoryBean可以更灵活创建更为复杂的bean,比如spring AOP 中的ProxyFactoryBean,比如加载属性文件的PropertiesFactoryBean......


©著作权归作者所有:来自51CTO博客作者mb5fdb0a4002420的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 讲一讲ES6新增的两种数据结构Map和Set
  2. JavaScript 中 call()、apply()、bind() 的用法
  3. 内存迟迟下不去,可能你就差一个GC.Collect
  4. C# EmguCV图像处理实例
  5. 第7章 0202-面向对象编程基础,学习心得、笔记(类声明,类的实例化,类
  6. 类与对象之重载和命名空间的概念
  7. 西门子PLC s7-1200 1500 modbus-rtu通信实例编程详细指导
  8. vue学习之路(路由)
  9. vue学习之路(组件)

随机推荐

  1. android meta-data 使用详解
  2. android shape
  3. Android layout布局属性、标签属性总结大
  4. Android之JNI续
  5. 【Android】Support 包里究竟有什么
  6. 哥哥手把手教你认识AIDL的详细使用,来了老
  7. android 横竖屏切换
  8. Android : Your APK does not seem to be
  9. 【Android】Android EditText 去除边框
  10. android 获取路径目录方法