【问题标题】:Custom initializing of beans annotated with a custom annotation使用自定义注释注释的 bean 的自定义初始化
【发布时间】:2019-07-17 22:31:48
【问题描述】:

例如,我有一些用 @Foo 注释的 bean,我想跟踪这些,因为我想控制它们初始化时会发生什么,有没有办法注册一个自定义的 spring beanfactory 允许我要这样做吗?

如果我有另一个注解 @Bar 也需要这种特殊初始化呢?

我最初的想法是通知用户用@Lazy注解每个bean,然后使用bean工厂后处理器,我将更改bean定义的一些属性。

【问题讨论】:

  • 那些注解是你定制的,还是spring注解?如果它们是由您制作的,您可能已经控制了它们的生命周期。如果没有,您可以使用beanFactoryPostProcessorbeanPostProcessor 在其生命周期的不同部分更改它们的初始化。这个问题可能会有所帮助:stackoverflow.com/questions/30455536/…

标签: java spring lazy-evaluation spring-bean


【解决方案1】:

解决方案是实现BeanFactoryPostProcessor 接口。这使我们可以访问BeanDefinition任何bean 被实例化,因此允许我们更改范围之类的东西,或者使bean 延迟初始化,甚至更改bean 的构造函数参数!

如果您的 spring 应用程序是手动启动的,即通过创建SpringApplicationBuilder,那么您甚至可以将此类的实例传递给构建器的构造函数,并且一旦启动应用程序就会使用它。

@Component
public class FooBarBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(@NonNull ConfigurableListableBeanFactory beanFactory) throws BeansException {
        /*
        String[] fooBeans = beanFactory.getBeanNamesForAnnotation(Foo.class);
        BeanDefinition bean = beanFactory.getBeanDefinition(...);

        /* do your processing here ... */
    }
}

附言需要@Component 注释才能工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2020-10-08
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多