Spring: 在运行时检测惰性 beans
Spring: detect lazy beans at runtime
有没有什么方法可以检测一个 bean 是否被惰性初始化并可靠地工作,并且对于上下文中的每个 bean?
特别是这样的 bean:
@Configuration
class MyConfig() {
@Bean
@Lazy
Foo foo() {
return new Foo();
}
我找不到任何方法来以编程方式检测 'foo' 是懒惰的。
其他像这样的懒豆:
@Lazy
@Component
class Bar {
...
}
可以用类似的东西检测到:
boolean isLazy = applicationContext.findAnnotationOnBean(beanName, Lazy.class) != null
这是不可靠的,它会产生误报,例如,如果 Bar
bean 是配置的一部分,它会急切地初始化它。
如果使用延迟初始化来初始化以下 bean,您可以使用 ConfigurableListableBeanFactory.getBeanDefinition(String name)
to get BeanDefinition
instance and call BeanDefinition.isLazyInit()
获取信息。它适用于您描述的两种情况 - 当 @Lazy
用于 class 和 bean 工厂方法时。看看下面的例子,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
是一个组件 class,带有 @Lazy
注释。希望对你有帮助。
有没有什么方法可以检测一个 bean 是否被惰性初始化并可靠地工作,并且对于上下文中的每个 bean?
特别是这样的 bean:
@Configuration
class MyConfig() {
@Bean
@Lazy
Foo foo() {
return new Foo();
}
我找不到任何方法来以编程方式检测 'foo' 是懒惰的。
其他像这样的懒豆:
@Lazy
@Component
class Bar {
...
}
可以用类似的东西检测到:
boolean isLazy = applicationContext.findAnnotationOnBean(beanName, Lazy.class) != null
这是不可靠的,它会产生误报,例如,如果 Bar
bean 是配置的一部分,它会急切地初始化它。
如果使用延迟初始化来初始化以下 bean,您可以使用 ConfigurableListableBeanFactory.getBeanDefinition(String name)
to get BeanDefinition
instance and call BeanDefinition.isLazyInit()
获取信息。它适用于您描述的两种情况 - 当 @Lazy
用于 class 和 bean 工厂方法时。看看下面的例子,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
是一个组件 class,带有 @Lazy
注释。希望对你有帮助。