有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

下面是一个场景:

我有一个SpringXML配置,其中包括一些惰性bean、一些非惰性bean和一些依赖于其他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。从来源来看,似乎没有任何简单的方法来回答我的问题


共 (2) 个答案

  1. # 1 楼答案

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

    1. 创建ExtendedApplicationContext实现ApplicationContextAware
    2. 让bean在ExtendedApplicationContext的静态实例上调用initialized(this)
    3. 使用这个集合加上所有不是单例、抽象或惰性初始化的bean定义集合,在ExtendedApplicationContext中创建初始化bean集合

    欢迎提出更好的建议

  2. # 2 楼答案

    这可能是最好的方法,使用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;
        }
    
    }
    

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