浏览 7195 次
锁定老帖子 主题:关于spring ioc容器的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-29
在该类中有private Object resolveReference(String argName, RuntimeBeanReference ref)这样1个方法. 源代码如下: private Object resolveReference(String argName, RuntimeBeanReference ref) { if (this.beanFactory.logger.isTraceEnabled()) { this.beanFactory.logger.trace("Resolving reference from property " + argName + " in bean '" + this.beanName + "' to bean '" + ref.getBeanName() + "'"); } try { if (ref.isToParent()) { if (this.beanFactory.getParentBeanFactory() == null) { throw new BeanCreationException( this.beanDefinition.getResourceDescription(), this.beanName, "Can't resolve reference to bean '" + ref.getBeanName() + "' in parent factory: no parent factory available"); } return this.beanFactory.getParentBeanFactory().getBean(ref.getBeanName()); } else { Object bean = this.beanFactory.getBean(ref.getBeanName()); if (this.beanDefinition.isSingleton()) { this.beanFactory.registerDependentBean(ref.getBeanName(), this.beanName); } return bean; } } catch (BeansException ex) { throw new BeanCreationException( this.beanDefinition.getResourceDescription(), this.beanName, "Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, ex); } } 这个方法的大致作用是,取得bean所依赖的bean实例.但这里遇到问题了.ioc容器在这里做了1个依赖关系的map.但建立了这个依赖关系后,也没有具体使用到他的地方.难以理解设计者的思想. 请各位帮忙解答.谢谢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-29
我想,应该指的是这段代码:
if (this.beanDefinition.isSingleton()) { this.beanFactory.registerDependentBean(ref.getBeanName(), this.beanName); } return bean; } 这里面注册的这个map起的是什么作用?好像没有看到什么地方用到它。 |
|
返回顶楼 | |
发表时间:2007-07-03
我想他是用在清理内存的时候吧。你可以看abstractBeanFactroy里的代码片段
|
|
返回顶楼 | |
发表时间:2007-07-03
baallee 写道 我想他是用在清理内存的时候吧。你可以看abstractBeanFactroy里的代码片段
能不能说得详细一些?大家一起讨论讨论 |
|
返回顶楼 | |
发表时间:2007-07-03
/** * Add the given bean to the list of disposable beans in this factory, * registering its DisposableBean interface and/or the given destroy method * to be called on factory shutdown (if applicable). Only applies to singletons. * <p>Also registers bean as dependent on other beans, according to the * "depends-on" configuration in the bean definition. * @param beanName the name of the bean * @param bean the bean instance * @param mbd the bean definition for the bean * @see RootBeanDefinition#isSingleton * @see RootBeanDefinition#getDependsOn * @see #registerDisposableBean * @see #registerDependentBean */ protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) { if (mbd.isSingleton() && requiresDestruction(bean, mbd)) { // Register a DisposableBean implementation that performs all destruction // work for the given bean: DestructionAwareBeanPostProcessors, // DisposableBean interface, custom destroy method. registerDisposableBean(beanName, new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors())); // Register bean as dependent on other beans, if necessary, // for correct shutdown order. String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (int i = 0; i < dependsOn.length; i++) { registerDependentBean(dependsOn[i], beanName); } } } } comment中有提到当destroy method to be called on factory shutdown,只是猜想没深入看源码 |
|
返回顶楼 | |
发表时间:2007-07-03
baallee 写道 protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) { if (mbd.isSingleton() && requiresDestruction(bean, mbd)) { // Register a DisposableBean implementation that performs all destruction // work for the given bean: DestructionAwareBeanPostProcessors, // DisposableBean interface, custom destroy method. registerDisposableBean(beanName, new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors())); // Register bean as dependent on other beans, if necessary, // for correct shutdown order. String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (int i = 0; i < dependsOn.length; i++) { registerDependentBean(dependsOn[i], beanName); } } } } comment中有提到当destroy method to be called on factory shutdown,只是猜想没深入看源码 奇怪的是我在ResolveReference也就是依赖注入的时候看到这个registerDependentBean,同时也在 createBean的最后一部registerDisposableBeanIfNecessary(beanName, originalBean, mergedBeanDefinition)中调用了,为什么要调用两次呢? 调用的代码是: public void registerDependentBean(String beanName, String dependentBeanName) { synchronized (this.dependentBeanMap) { Set dependencies = (Set) this.dependentBeanMap.get(beanName); if (dependencies == null) { dependencies = CollectionFactory.createLinkedSetIfPossible(8); this.dependentBeanMap.put(beanName, dependencies); } dependencies.add(dependentBeanName); } } 当然在registerDisposableBeanIfNecessary里面调用,可以保证能在shutdown的时候根据适当的依赖顺序来dispose,但是弄不清楚的是在ResolveReference里,记录这些依赖信息什么时候会被使用? |
|
返回顶楼 | |
发表时间:2007-10-16
在Spring源码的注释上写的很清楚,在单态bean销毁的时候,会按照这个map中定义的顺序进行。
|
|
返回顶楼 | |