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);
}
}
}