package org.theonefx.wcframework.ioc; import java.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.List; import org.theonefx.wcframework.core.ClassWrapper; import org.theonefx.wcframework.core.exception.BeanCreationException; import org.theonefx.wcframework.core.exception.BeansException; import org.theonefx.wcframework.utils.Assert; public class BeanFactoryPostProcesser extends FactoryBeanFactory implements BeanPostProcessorRegister { private boolean hasPropertyPostProcess; private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<BeanPostProcessor>(); @Override public void regist(BeanPostProcessor beanPostProcessor) { Assert.notNull(beanPostProcessor, "BeanPostProcessor不能为空"); this.beanPostProcessors.remove(beanPostProcessor); this.beanPostProcessors.add(beanPostProcessor); if (beanPostProcessor instanceof PropertyPostProcess) { hasPropertyPostProcess = true; } } protected boolean hasPropertyPostProcess() { return hasPropertyPostProcess; } private List<BeanPostProcessor> getBeanPostProcessors() { return this.beanPostProcessors; } protected Object resolveBeforeInstantiation(String id, ClassWrapper<?> classWrapper, RootBeanDefinition mbd) { Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { if (mbd.hasBeanClass()) { bean = applyBeanPostProcessorsBeforeInstantiation(classWrapper, id); if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(mbd, bean, classWrapper, id); } } mbd.beforeInstantiationResolved = (bean != null); } return bean; } protected Object applyBeanPostProcessorsBeforeInstantiation(ClassWrapper<?> classWrapper, String id) throws BeansException { Object o = null; for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationBeanPostProcessor) { InstantiationBeanPostProcessor ibp = (InstantiationBeanPostProcessor) bp; o = ibp.postProcessBeforeInstantiation(classWrapper, o, id); } } return o; } protected Object applyBeanPostProcessorsAfterInitialization(RootBeanDefinition mbd, Object existingBean, ClassWrapper<?> classWrapper, String id) throws BeansException { Object o = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { if (beanProcessor instanceof InitializationBeanPostProcess) { InitializationBeanPostProcess ibp = (InitializationBeanPostProcess) beanProcessor; o = ibp.postProcessAfterInitialization(mbd, o, classWrapper, id); } } return o; } protected Object applyBeanPostProcessAfterInstantiation(String id, RootBeanDefinition mbd, ClassWrapper<?> classWrapper, Object bean) { Object o = bean; for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationBeanPostProcessor) { InstantiationBeanPostProcessor ibp = (InstantiationBeanPostProcessor) bp; o = ibp.postProcessAfterInstantiation(id, mbd, classWrapper, bean); } } return o; } protected Object applyBeanPostProcessorsBeforeInitialization(RootBeanDefinition mbd, Object bean, ClassWrapper<?> classWrapper, String beanName) throws BeansException { Object o = bean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { if (beanProcessor instanceof InitializationBeanPostProcess) { InitializationBeanPostProcess ibp = (InitializationBeanPostProcess) beanProcessor; o = ibp.postProcessBeforeInitialization(mbd, o, classWrapper, beanName); } } return o; } protected PropertyValues applyPostProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] filteredPds, Object wrappedInstance, String id) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof PropertyPostProcess) { PropertyPostProcess ppp = (PropertyPostProcess) bp; pvs = ppp.postProcessPropertyValues(pvs, filteredPds, wrappedInstance, id); if (pvs == null) { return null; } } } return pvs; } protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, ClassWrapper<?> classWrapper, String id) throws BeansException { try { synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof MergedBeanDefinitionPostProcessor) { MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp; bdp.postProcessMergedBeanDefinition(mbd, classWrapper, id); } } mbd.postProcessed = true; } } } catch (Exception ex) { throw new BeanCreationException(id, "后置处理BeanDefinition失败,BeanClass: [" + classWrapper.getWrapperedClass() + "] BeanId: '" + id + "'", ex); } } }