One βsolutionβ is to add a mail processor bean to the child context that runs the parent post processors. This is the technique in which we ended up using. This is potentially dangerous, and not IMO's best spring practice.
public class ParentContextBeanPostProcessor implements BeanPostProcessor {
private final Collection<BeanPostProcessor> parentProcessors;
private final BeanFactory beanFactory;
private final BeanFactory parentBeanFactory;
public ParentContextBeanPostProcessor(ConfigurableApplicationContext parent, BeanFactory beanFactory) {
this.parentProcessors = parent.getBeansOfType(BeanPostProcessor.class).values();
this.beanFactory = beanFactory;
this.parentBeanFactory = parent.getBeanFactory();
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
for (BeanPostProcessor processor : parentProcessors) {
if (processor instanceof BeanFactoryAware) {
((BeanFactoryAware) processor).setBeanFactory(beanFactory);
}
try {
bean = processor.postProcessBeforeInitialization(bean, beanName);
} finally {
if (processor instanceof BeanFactoryAware) {
((BeanFactoryAware) processor).setBeanFactory(parentBeanFactory);
}
}
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
for (BeanPostProcessor processor : parentProcessors) {
if (processor instanceof BeanFactoryAware) {
((BeanFactoryAware) processor).setBeanFactory(beanFactory);
}
try {
bean = processor.postProcessAfterInitialization(bean, beanName);
} finally {
if (processor instanceof BeanFactoryAware) {
((BeanFactoryAware) processor).setBeanFactory(parentBeanFactory);
}
}
}
return bean;
}
}
source
share