欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FactoryBean(自定义Bean的实例化逻辑)

程序员文章站 2022-05-23 18:04:49
...

官方文档:https://docs.spring.io/spring-framework/docs/4.0.0.RELEASE/spring-framework-reference/html/beans.html#beans-factory-extension-factorybean

FactoryBean接口是Spring IoC容器Bean实例化逻辑的一个扩展点,如果有复杂的初始化Bean逻辑,则可以选择创建自定义FactoryBean,在该类中编写初始化逻辑,然后把自定义FactoryBean注入到容器中即可。

FactoryBean提供了三种方法:

  • Object getObject():返回此工厂创建的对象的实例。实例可以共享,具体取决于该工厂是否返回单例或原型。

  • boolean isSingleton():true表示返回单例对象。

  • Class getObjectType():返回getObject()方法返回的对象类型;如果类型null,则返回null。

从容器中获取Bean的方式

  1. 获取自定义FactoryBean本身:在bean名称前加上&符号,如-ApplicationContext.getBean("&beanA");

  2. 获取自定义FactoryBean生成的Bean:正常调用即可返回生成的Bean,如-ApplicationContext.getBean("beanA");

使用示例

自定义FactoryBean

@Component
publicclass BeanAFactoryBean implements FactoryBean<BeanA> {

    @Override
    public BeanA getObject() throws Exception {
        return new BeanA("factory bean");
    }

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

BeanA

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class BeanA {
    private String name;
}

打印BeanA的name属性值

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanAFactoryBean.class);

@Test
public void test() {
    BeanA bean = applicationContext.getBean(BeanA.class);
    System.out.println(bean.getName());
}