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