[英]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,這使得此操作不可預測。
到目前為止,我的解決方案是:
ApplicationContextAware
ExtendedApplicationContext
ExtendedApplicationContext
的靜態實例上initialized(this)
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.