使用自定义注释注释的 bean 的自定义初始化
Custom initializing of beans annotated with a custom annotation
例如,我有一些用 @Foo
注释的 bean,我想跟踪这些 bean,因为我想控制它们初始化时发生的事情,有没有办法注册自定义 spring 允许我这样做的 beanfactory?
如果我有另一个注解 @Bar
也需要这种特殊的初始化怎么办?
我最初的想法是通知用户用 @Lazy
注释来注释每个 bean,然后使用 bean 工厂 post 处理器,我将更改 bean 定义的一些属性。
解决方案是在实例化任何bean之前实现BeanFactoryPostProcessor
interface. This gives us access to the BeanDefinition
,因此允许我们更改范围之类的东西,或者使bean延迟初始化甚至更改 bean 的构造函数参数!
如果您的 spring 应用程序是手动启动的,即通过创建 SpringApplicationBuilder
,那么您甚至可以将此 class 的实例传递给构建器的构造函数,它将是应用程序启动后使用。
@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 ... */
}
}
p.s。 @Component
此功能需要注释
例如,我有一些用 @Foo
注释的 bean,我想跟踪这些 bean,因为我想控制它们初始化时发生的事情,有没有办法注册自定义 spring 允许我这样做的 beanfactory?
如果我有另一个注解 @Bar
也需要这种特殊的初始化怎么办?
我最初的想法是通知用户用 @Lazy
注释来注释每个 bean,然后使用 bean 工厂 post 处理器,我将更改 bean 定义的一些属性。
解决方案是在实例化任何bean之前实现BeanFactoryPostProcessor
interface. This gives us access to the BeanDefinition
,因此允许我们更改范围之类的东西,或者使bean延迟初始化甚至更改 bean 的构造函数参数!
如果您的 spring 应用程序是手动启动的,即通过创建 SpringApplicationBuilder
,那么您甚至可以将此 class 的实例传递给构建器的构造函数,它将是应用程序启动后使用。
@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 ... */
}
}
p.s。 @Component
此功能需要注释