gpt4 book ai didi

java - Spring:在运行时检测惰性 bean

转载 作者:行者123 更新时间:2023-11-30 02:16:13 25 4
gpt4 key购买 nike

是否有任何方法可以检测 bean 是否被延迟初始化,并且对于上下文中的每个 bean 都可靠地工作?

特别是像这样的 bean:

@Configuration
class MyConfig() {

@Bean
@Lazy
Foo foo() {
return new Foo();
}

我找不到任何方法来以编程方式检测“foo”是否惰性。

其他类型的懒 bean ,例如:

@Lazy
@Component
class Bar {
...
}

可以通过以下方式检测:

boolean isLazy = applicationContext.findAnnotationOnBean(beanName, Lazy.class) != null

这并不可靠,它可能会产生误报,例如,如果 Bar bean 是急切初始化它的配置的一部分。

最佳答案

您可以使用ConfigurableListableBeanFactory.getBeanDefinition(String name)获取 BeanDefinition 实例并调用 BeanDefinition.isLazyInit()获取以下 bean 是否使用延迟初始化进行初始化的信息。它适用于您描述的两种情况 - 当在类和 bean 工厂方法上使用 @Lazy 时。看一下下面的示例,load 打印出所有延迟加载的 bean:

import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;

@SpringBootApplication
public class Application {

@Bean
@Lazy
public Foo foo() {
return new Foo();
}

public static void main(String[] args) {
final ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);

ctx.getBeanFactory().getBeanNamesIterator().forEachRemaining(bean -> {
try {
final BeanDefinition beanDefinition = ctx.getBeanFactory().getBeanDefinition(bean);
if (beanDefinition.isLazyInit()) {
System.out.println("Bean '" + bean + "' is lazy initialized...");
}
} catch (NoSuchBeanDefinitionException e) {}
});
}

static class Foo {
private boolean bar = true;
}
}

当我运行它时,我在控制台中看到以下部分:

Bean 'otherLazyBean' is lazy initialized...
Bean 'foo' is lazy initialized...
Bean 'mvcHandlerMappingIntrospector' is lazy initialized...

这个otherLazyBean是一个带有@Lazy注解的组件类。希望对您有所帮助。

关于java - Spring:在运行时检测惰性 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com