/** * Determine whether the given bean requires destruction on shutdown. * <p>The default implementation checks the DisposableBean interface as well as * a specified destroy method and registered DestructionAwareBeanPostProcessors. * @param bean the bean instance to check * @param mbd the corresponding bean definition * @see org.springframework.beans.factory.DisposableBean * @see AbstractBeanDefinition#getDestroyMethodName() * @see org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor */ protected boolean requiresDestruction(Object bean, RootBeanDefinition mbd) { return (bean.getClass() != NullBean.class && (DisposableBeanAdapter.hasDestroyMethod(bean, mbd) || (hasDestructionAwareBeanPostProcessors() && DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors())))); }
/** * Destroy the given bean instance (usually a prototype instance * obtained from this factory) according to the given bean definition. * @param beanName the name of the bean definition * @param bean the bean instance to destroy * @param mbd the merged bean definition */ protected void destroyBean(String beanName, Object bean, RootBeanDefinition mbd) { new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), getAccessControlContext()).destroy(); }
.getBeanPostProcessors() : new ArrayList<>()); parentPostProcessors.addAll(parent instanceof AbstractBeanFactory ? ((AbstractBeanFactory) parent) .getBeanPostProcessors() : new ArrayList<>()); .getBeanPostProcessors() : new ArrayList<>();
/** * Determine whether the given bean requires destruction on shutdown. * <p>The default implementation checks the DisposableBean interface as well as * a specified destroy method and registered DestructionAwareBeanPostProcessors. * @param bean the bean instance to check * @param mbd the corresponding bean definition * @see org.springframework.beans.factory.DisposableBean * @see AbstractBeanDefinition#getDestroyMethodName() * @see org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor */ protected boolean requiresDestruction(Object bean, RootBeanDefinition mbd) { return (bean.getClass() != NullBean.class && (DisposableBeanAdapter.hasDestroyMethod(bean, mbd) || (hasDestructionAwareBeanPostProcessors() && DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors())))); }
/** * Destroy the given bean instance (usually a prototype instance * obtained from this factory) according to the given bean definition. * @param beanName the name of the bean definition * @param bean the bean instance to destroy * @param mbd the merged bean definition */ protected void destroyBean(String beanName, Object bean, RootBeanDefinition mbd) { new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), getAccessControlContext()).destroy(); }
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc)); new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc)); new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
@Test public void testParentConfigurationInheritedMultipleConfigs() { Resource resource1 = new ClassPathResource(ClassUtils.addResourcePathToPackagePath(getClass(), "abstract-context.xml")); Resource resource2 = new ClassPathResource(ClassUtils.addResourcePathToPackagePath(getClass(), "child-context-with-abstract-job.xml")); GenericApplicationContextFactory factory = new GenericApplicationContextFactory(resource1, resource2); ConfigurableApplicationContext context = factory.createApplicationContext(); assertEquals("concrete-job", context.getBeanNamesForType(Job.class)[0]); assertEquals("bar", context.getBean("concrete-job", Job.class).getName()); assertEquals(4, context.getBean("foo", Foo.class).values[1], 0.01); assertNotNull(context.getBean("concrete-job", JobSupport.class).getStep("step31")); assertNotNull(context.getBean("concrete-job", JobSupport.class).getStep("step32")); boolean autowiredFound = false; for (BeanPostProcessor postProcessor : ((AbstractBeanFactory) context.getBeanFactory()).getBeanPostProcessors()) { if (postProcessor instanceof AutowiredAnnotationBeanPostProcessor) { autowiredFound = true; } } assertTrue(autowiredFound); }
/** * Destroy the given bean instance (usually a prototype instance * obtained from this factory) according to the given bean definition. * @param beanName the name of the bean definition * @param beanInstance the bean instance to destroy * @param mbd the merged bean definition */ protected void destroyBean(String beanName, Object beanInstance, RootBeanDefinition mbd) { new DisposableBeanAdapter(beanInstance, beanName, mbd, getBeanPostProcessors(), getAccessControlContext()).destroy(); }
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc)); new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
/** * Extension point for special subclasses that want to do more complex things with the bean factory prior to * refresh. The default implementation copies all configuration from the parent according to the * {@link #setCopyConfiguration(boolean) flag} set. * * @param parent the parent bean factory for the new context (will never be null) * @param beanFactory the new bean factory before bean definitions are loaded * * @see AbstractApplicationContextFactory#setCopyConfiguration(boolean) * @see DefaultListableBeanFactory#copyConfigurationFrom(ConfigurableBeanFactory) */ protected void prepareBeanFactory(ConfigurableListableBeanFactory parent, ConfigurableListableBeanFactory beanFactory) { if (copyConfiguration && parent != null) { beanFactory.copyConfigurationFrom(parent); List<BeanPostProcessor> beanPostProcessors = beanFactory instanceof AbstractBeanFactory ? ((AbstractBeanFactory) beanFactory) .getBeanPostProcessors() : new ArrayList<BeanPostProcessor>(); for (BeanPostProcessor beanPostProcessor : new ArrayList<BeanPostProcessor>(beanPostProcessors)) { for (Class<?> cls : beanPostProcessorExcludeClasses) { if (cls.isAssignableFrom(beanPostProcessor.getClass())) { logger.debug("Removing bean post processor: " + beanPostProcessor + " of type " + cls); beanPostProcessors.remove(beanPostProcessor); } } } } }
.getBeanPostProcessors() : new ArrayList<BeanPostProcessor>()); parentPostProcessors.addAll(parent instanceof AbstractBeanFactory ? ((AbstractBeanFactory) parent) .getBeanPostProcessors() : new ArrayList<BeanPostProcessor>()); .getBeanPostProcessors() : new ArrayList<BeanPostProcessor>();
.getBeanPostProcessors() : new ArrayList<BeanPostProcessor>()); parentPostProcessors.addAll(parent instanceof AbstractBeanFactory ? ((AbstractBeanFactory) parent) .getBeanPostProcessors() : new ArrayList<BeanPostProcessor>()); .getBeanPostProcessors() : new ArrayList<BeanPostProcessor>();
public void destroy() throws Exception { if (hasDestructionAwareBeanPostProcessors()) { if (logger.isDebugEnabled()) { logger.debug("Applying DestructionAwareBeanPostProcessors to bean with name '" + beanName + "'"); } for (int i = getBeanPostProcessors().size() - 1; i >= 0; i--) { Object beanProcessor = getBeanPostProcessors().get(i); if (beanProcessor instanceof DestructionAwareBeanPostProcessor) { ((DestructionAwareBeanPostProcessor) beanProcessor).postProcessBeforeDestruction(bean, beanName); } } } if (isDisposableBean) { if (logger.isDebugEnabled()) { logger.debug("Invoking destroy() on bean with name '" + beanName + "'"); } ((DisposableBean) bean).destroy(); } if (hasDestroyMethod) { if (logger.isDebugEnabled()) { logger.debug("Invoking custom destroy method on bean with name '" + beanName + "'"); } invokeCustomDestroyMethod(beanName, bean, mergedBeanDefinition.getDestroyMethodName()); } } });
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc)); new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
/** * Destroy the given bean instance (usually a prototype instance * obtained from this factory) according to the given bean definition. * @param beanName the name of the bean definition * @param bean the bean instance to destroy * @param mbd the merged bean definition */ protected void destroyBean(String beanName, Object bean, RootBeanDefinition mbd) { new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), getAccessControlContext()).destroy(); }