Java 如何获得将在春季创建的bean集?

Java 如何获得将在春季创建的bean集?,java,spring,Java,Spring,下面是一个场景: 我有一个springxml配置,其中包括一些惰性bean、一些非惰性bean和一些依赖于其他bean的bean。最终Spring将解决所有这些问题,以便只创建要创建的bean 问题是:我如何通过编程来判断这个集合是什么 当我使用初始化bean的context.getBean(name)时BeanDefinition.isLazyInit()只会告诉我如何定义bean 还有其他想法吗 预计到达时间: 在DefaultListableBeanFactory中: public voi

下面是一个场景:

我有一个springxml配置,其中包括一些惰性bean、一些非惰性bean和一些依赖于其他bean的bean。最终Spring将解决所有这些问题,以便只创建要创建的bean

问题是:我如何通过编程来判断这个集合是什么

当我使用初始化bean的
context.getBean(name)
BeanDefinition.isLazyInit()
只会告诉我如何定义bean

还有其他想法吗

预计到达时间:

DefaultListableBeanFactory
中:

public void preInstantiateSingletons() throws BeansException {
    if (this.logger.isInfoEnabled()) {
        this.logger.info("Pre-instantiating singletons in " + this);
    }

    synchronized (this.beanDefinitionMap) {
        for (Iterator it = this.beanDefinitionNames.iterator(); it.hasNext();) {
            String beanName = (String) it.next();
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {
                    FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
                    if (factory instanceof SmartFactoryBean && ((SmartFactoryBean) factory).isEagerInit()) {
                        getBean(beanName);
                    }
                }
                else {
                    getBean(beanName);
                }
            }
        }
    }
}
可实例化bean集已初始化。初始化此集合时,还将创建此集合引用的不在此集合中的任何bean。从源代码来看,似乎没有任何简单的方法来回答我的问题。

也许

ApplicationContext.getBeanDefinitionNames()
请注意,没有(适当的)方法来确定哪些bean将被实例化,哪些不被实例化。如果您使用的是
ApplicationContextAware
,那么您可以在运行时访问所有bean,这使得这一点不可预测。

也许

ApplicationContext.getBeanDefinitionNames()
请注意,没有(适当的)方法来确定哪些bean将被实例化,哪些不被实例化。如果您使用的是
ApplicationContextAware
,您可以在运行时访问所有bean,这使得这一点不可预测。

到目前为止,我的解决方案是:

  • 创建
    ExtendedApplicationContext
    实现
    ApplicationContextAware
  • ExtendedApplicationContext的静态实例上初始化bean调用
    (this)
  • 使用此集合加上非单例、抽象或惰性初始化的所有bean定义集合,在
    ExtendedApplicationContext
  • 欢迎提出更好的建议。

    到目前为止,我的解决方案是:

  • 创建
    ExtendedApplicationContext
    实现
    ApplicationContextAware
  • ExtendedApplicationContext的静态实例上初始化bean调用
    (this)
  • 使用此集合加上非单例、抽象或惰性初始化的所有bean定义集合,在
    ExtendedApplicationContext

  • 欢迎提出更好的建议。

    这可能是最好的方法,使用
    BeanPostProcessor

    public class IsIntializedBeanPostProcessor implements BeanPostProcessor {
    
        private Set<String> initializedBeanNames = new HashSet<String>();
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            initializedBeanNames.add(beanName);
            return bean;
        }
    
        public Set<String> getInitializedBeanNames() {
            return initializedBeanNames;
        }
    
    }
    
    公共类IsInitializedBeanPostProcessor实现BeanPostProcessor{
    private Set initializedBeanNames=new HashSet();
    @凌驾
    公共对象后处理初始化后(对象bean、字符串beanName)抛出BeansException{
    返回豆;
    }
    @凌驾
    公共对象后处理BeforeInitialization(对象bean、字符串beanName)抛出BeanException{
    初始化beanName.add(beanName);
    返回豆;
    }
    公共集getInitializedBeanNames(){
    返回初始化的BeanNames;
    }
    }
    

    然后,您所要做的就是将其作为bean包含在Spring配置中的某个地方,以使其工作。

    这可能是最好的方法,使用
    BeanPostProcessor

    public class IsIntializedBeanPostProcessor implements BeanPostProcessor {
    
        private Set<String> initializedBeanNames = new HashSet<String>();
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            initializedBeanNames.add(beanName);
            return bean;
        }
    
        public Set<String> getInitializedBeanNames() {
            return initializedBeanNames;
        }
    
    }
    
    公共类IsInitializedBeanPostProcessor实现BeanPostProcessor{
    private Set initializedBeanNames=new HashSet();
    @凌驾
    公共对象后处理初始化后(对象bean、字符串beanName)抛出BeansException{
    返回豆;
    }
    @凌驾
    公共对象后处理BeforeInitialization(对象bean、字符串beanName)抛出BeanException{
    初始化beanName.add(beanName);
    返回豆;
    }
    公共集getInitializedBeanNames(){
    返回初始化的BeanNames;
    }
    }
    

    然后,您所要做的就是将其作为bean包含在Spring配置的某个地方,以使其工作。

    不幸的是,这仍然提供了一整套定义的bean。我不理解“打算创建的bean”是什么意思。所有bean都是要创建的。除非需要,否则不会创建lazy-init bean。并且isLazyInit()不会返回bean是否是懒惰的?是的,但它不会说bean是否已创建-一些懒惰bean将已创建,有些不会。不幸的是,这仍然提供了一整套定义的bean。我不明白“要创建的bean”是什么意思。所有bean都是要创建的。lazy-init bean除非需要,否则不会创建。isLazyInit()不会返回该bean是否懒惰?是的,但它不会说该bean是否已创建-一些懒惰的bean将已创建,一些不会。它们是您在晚秋种植的bean。它们是您在晚秋种植的bean。