Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:在运行时检测惰性bean_Java_Spring_Spring Boot_Spring Bean - Fatal编程技术网

Java Spring:在运行时检测惰性bean

Java Spring:在运行时检测惰性bean,java,spring,spring-boot,spring-bean,Java,Spring,Spring Boot,Spring Bean,是否有任何方法可以检测到一个bean是否被惰性地初始化,并且对于上下文中的每个bean都能可靠地工作 特别是像这样的bean: @Configuration class MyConfig() { @Bean @Lazy Foo foo() { return new Foo(); } 我找不到任何方法以编程方式检测“foo”是否懒惰 其他类型的懒惰bean,例如: @Lazy @Component class Bar { ... } 可以通过以下方式进行检测: boolean isL

是否有任何方法可以检测到一个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
这是不可靠的,它可能会产生误报,例如,如果
bean是急切地初始化它的配置的一部分。

如果下面的bean是使用延迟初始化初始化的,则可以使用来获取
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
注释的组件类。希望有帮助。

谢谢
BeanDefinition
正是我要找的对象类型。对于其他类似操作,我自动连接了一个
ConfigurableApplicationContext
,然后从中获得了
BeanFactory
。之前我是自动连接
ApplicationContext
,所以
getBeanFactory
不可用。你能告诉我是否加载了惰性bean而不是注释吗?