11-FactoryBean

如果存在当前bean的FactoryBean, spring认为诸如依赖注入、初始化、Aware等这些生命阶段都应该有FactoryBean种处理, 所以即使这里配置了都不会生效

准备bean以及生命周期阶段实现

@Slf4j
public class Bean1 implements BeanFactoryAware {

    private Bean2 bean2;

    @Autowired
    public void setBean2(Bean2 bean2) {
        log.warn("setBean2({})", bean2);
        this.bean2 = bean2;
    }

    public Bean2 getBean2() {
        return bean2;
    }

    @PostConstruct
    public void init() {
        log.warn("init");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        log.warn("setBeanFactory({})", beanFactory);
    }
}

@Component
public class Bean2 {
}

准备BeanPostProcessor

@Slf4j
@Component
public class Bean1PostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 初始化前操作也不会执行
        if ("bean1".equals(beanName) && bean instanceof Bean1) {
            log.warn("before [{}] init", beanName);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 初始化后操作会执行
        if ("bean1".equals(beanName) && bean instanceof Bean1) {
            log.warn("after [{}] init", beanName);
        }
        return bean;
    }
}

准备FactoryBean

@Slf4j
@Component("bean1")
public class Bean1FactoryBean implements FactoryBean<Bean1> {

    @Override
    public Bean1 getObject() throws Exception {
        Bean1 bean1 = new Bean1();
        log.warn("createBean1:{}", bean1);
        return bean1;
    }

    @Override
    public Class<?> getObjectType() {
        // applicationContext.getBean(Bean1.class) 需要此方法返回类型  否则return null就会报错
        // return null;
        return Bean1.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

测试

@ComponentScan
public class TestFactoryBean {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestFactoryBean.class);
        Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
        Bean1 bean2 = (Bean1) applicationContext.getBean("bean1");
        Bean1 bean3 = (Bean1) applicationContext.getBean("bean1");

        System.out.println(bean1);
        System.out.println(bean2);
        System.out.println(bean3);

        // getObjectType#getObjectType方法需要返回类型
        System.out.println(applicationContext.getBean(Bean1.class));

        // 获取Bean1FactoryBean的方式
        System.out.println(applicationContext.getBean(Bean1FactoryBean.class));
        System.out.println(applicationContext.getBean("&bean1"));

        applicationContext.close();
    }

}

小结

  1. 被FactoryBean创建的产品
    1. 会认为创建、依赖注入、Aware接口回调、前初始化这些都是FactoryBean的职责,这些流程都不会执
    2. 唯有后初始化的流程会走,也就是bean可以被代理增强
    3. 单例的产品不会存储于BeanFactory的singletonObjects成员中,而是另一个factoryBeanObjectCache成员中
  2. 按名字去获取时,拿到的是产品对象,名字前面加 & 获取的是工厂对象
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FactoryBean是Spring框架提供的一个接口,用于生成Bean实例的工厂。它允许我们在创建Bean实例时进行一些自定义的逻辑处理。FactoryBean接口有两个关键方法:getObject()和getObjectType()。 getObject()方法用于返回一个由FactoryBean创建的Bean实例,这个方法可以在每次调用时返回一个新的实例,也可以返回同一个实例。 getObjectType()方法用于返回由FactoryBean创建的Bean实例的类型。这个方法在Spring容器需要自动注入Bean时会被用到。 使用FactoryBean可以实现一些特殊的功能,例如延迟初始化、条件创建、动态代理等。我们可以通过在配置文件中使用<bean>标签,并指定FactoryBean的实现类来创建Bean实例。 例如,以下是一个使用FactoryBean创建Bean的示例: ```java public class MyFactoryBean implements FactoryBean<MyBean> { @Override public MyBean getObject() throws Exception { // 创建并返回MyBean实例 return new MyBean(); } @Override public Class<MyBean> getObjectType() { return MyBean.class; } @Override public boolean isSingleton() { return true; // 返回true表示单例模式,返回false表示原型模式 } } // 在配置文件中使用FactoryBean <bean id="myBean" class="com.example.MyFactoryBean" /> ``` 在上面的示例中,通过配置文件中的<bean>标签指定了MyFactoryBean类作为创建myBean实例的工厂。当需要获取myBean实例时,Spring容器会调用MyFactoryBean的getObject()方法返回一个MyBean实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

层巅余落日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值