簡體   English   中英

如何獲取將在Spring中創建的Bean集?

[英]How to get the set of beans that are to be created in Spring?

所以這是場景:

我有一個Spring XML配置,其中包含一些懶豆,一些非懶豆和一些依賴於其他bean的bean。 最終,Spring將解決所有這些問題,以便僅創建要創建的bean。

問題:我如何以編程方式知道這個集合是什么?

當我使用context.getBean(name)初始化bean時。 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,這使得此操作不可預測。

到目前為止,我的解決方案是:

  1. 創建實現ApplicationContextAware ExtendedApplicationContext
  2. 讓bean在ExtendedApplicationContext的靜態實例上initialized(this)
  3. 使用此集合以及不是單例,抽象或延遲初始化的所有非bean定義的集合在ExtendedApplicationContext創建初始化的bean集合

歡迎任何更好的建議。

這可能是使用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;
    }

}

然后,您所需要做的就是在Spring配置中的某個地方將其作為bean包括在內,以使其正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM