可配置的 Spring bean 文件的延迟加载@Lazy(TRUE/FALSE - 这来自属性文件/System Pr



我有 50 多个标有@Service@Lazy的奇数类。使用此配置,如果需要满足任何要求,我无法急切地加载这些豆子。有没有像@Lazy(${user.property.bena.loading.type)}这样的解决方案,这样我就可以通过切换布尔开关随意更改豆子的加载方式。

否则,我找到两个解决方案:

1 - 将所有@lazy替换为@Lazy(false)- 这是有风险的,对于 50 个奇数文件来说不是一个好方法

2 - 使用不同的弹簧配置文件创建一个重复的类@Lazy(true)另一个使用@Lazy(false)- 这将是代码重复性

来自官方的春季文档:

如果存在并设置为 true,则在被另一个 Bean 引用或从封闭的 BeanFactory 显式检索之前,不会初始化@Bean或@Component。

您能否详细说明您的评论:

如果我需要任何要求,我不能急切地加载这些豆子

因为如果您需要这些 bean 并且这些 bean 被注入到所需的类中,那么这些 bean 将在首次引用这些时可用。这就是@Lazy服务的目的。

对于动态延迟初始化,您可以创建一个BeanFactoryPostProcessor来检查特定 Bean 是否需要延迟初始化。下面的实现就足够了。

创建标记注释,例如LazyMarker

@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface LazyMarker {
}

创建设置懒惰标志的BeanFactoryPostProcessor

@Component
public class SamplePostProcessor implements BeanFactoryPostProcessor, EnvironmentAware {
private Environment environment;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
if (Boolean.valueOf(environment.getProperty("lazy"))) {
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
Class<?> beanType = beanFactory.getType(beanDefinitionName);
LazyMarker lazyValue = AnnotationUtils.findAnnotation(beanType, LazyMarker.class);
if (lazyValue != null) {
beanFactory.getBeanDefinition(beanDefinitionName).setLazyInit(true);
}
}
}
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}

最新更新