Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 在实例化阶段之前/期间检索bean类_Java_Spring_Spring Boot - Fatal编程技术网

Java 在实例化阶段之前/期间检索bean类

Java 在实例化阶段之前/期间检索bean类,java,spring,spring-boot,Java,Spring,Spring Boot,在Spring应用程序中,可以使用applicationContext.getBeansOfType(Object.class)检索所有(?)bean。当然,这只有在创建了所有bean之后才可能 因此,如果我在一个Bean的构造函数中调用这个方法,我必须很幸运,能够成为最后一个被创建的Bean,能够访问所有这些Bean 据我所知,SpringBean的定义是在初始化Bean之前创建BeanDefinitions的一个阶段 如何在Bean的构造函数中检索所有创建的BeanDefinition 我

在Spring应用程序中,可以使用
applicationContext.getBeansOfType(Object.class)
检索所有(?)bean。当然,这只有在创建了所有bean之后才可能

因此,如果我在一个Bean的构造函数中调用这个方法,我必须很幸运,能够成为最后一个被创建的Bean,能够访问所有这些Bean

据我所知,SpringBean的定义是在初始化Bean之前创建BeanDefinitions的一个阶段

  • 如何在Bean的构造函数中检索所有创建的BeanDefinition
  • 我还可以检索这些BeanDefinition的类型(如
    )吗?该类型似乎只提供“此bean定义的当前bean类名”

或者是在构造完所有bean(例如,
@PostConstruct
)之后获取这些类型的唯一方法?

您可以创建最后一个bean,例如,将它以最小的初始化顺序放入
@Configuration
类中,以便它是具有最小初始化顺序的最后一个bean
@顺序(有序。最低优先级)
,即:

@Configuration
@Order(Ordered.LOWEST_PRECEDENCE)
public class Last {

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public String lastBean() {

        applicationContext.getBeanDefinitionNames();    //retrive all created BeanDefinitions in the constructor of a Bean

        applicationContext.getBeansOfType(Object.class); //retrive the types (as Class) 

        return "lastBean";
    }

}

也许这个代码能帮上忙

    for (String name : applicationContext.getBeanFactory().getBeanDefinitionNames()) {
        BeanDefinition beanDefinition = applicationContext.getBeanFactory().getBeanDefinition(name);
        String className = beanDefinition.getBeanClassName();
        Class<?> clazz = Class.forName(className);
    }
for(字符串名称:applicationContext.getBeanFactory().getBeanDefinitionNames()){
BeanDefinition BeanDefinition=applicationContext.getBeanFactory().getBeanDefinition(名称);
String className=beanDefinition.getBeanClassName();
Class clazz=Class.forName(className);
}
循环获取所有的
BeanDefinition
s,然后为每个BeanDefinition加载类并执行所需操作


顺便说一句,这可能不是使用Spring的好方法,但它会起作用。

嗨,James,这似乎就是我一直在寻找的。你能告诉我,为什么这不是使用Spring的好方法吗?我试图做的是,通过处理所有Springbean(即所有组件扫描)上的注释来配置Bean。当然,在构造之后初始化Bean是可能的,但是我担心,有人可能会在Bean完全初始化之前尝试使用它。我不知道还有什么办法可以做到这一点。一般来说,我会说,查看bean定义可能意味着您试图绕过Spring行为,但如果这是您所需要的,那就没问题了。这个API就是用来使用的。很高兴这有帮助。