繁体   English   中英

春季:在运行时检测懒豆

[英]Spring: detect lazy beans at runtime

是否有任何方法可以检测是否对bean进行了延迟初始化,并且该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)获取BeanDefinition实例,并调用BeanDefinition.isLazyInit()获取信息。 它适用于您描述的两种情况-在类和bean工厂方法上使用@Lazy时。 看一下下面的示例,该示例加载打印出所有延迟加载的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注释注释的组件类。 希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM