Java tutorial
package prospring3.ch5.beanpostprocessor; import org.springframework.aop.framework.Advised; import org.springframework.aop.framework.AopInfrastructureBean; import org.springframework.aop.framework.ProxyConfig; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.AopUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered; import org.springframework.util.ClassUtils; import javax.annotation.PostConstruct; import java.lang.annotation.Annotation; /** * *********************************************************************** * <p/> * Copyright: * 2012 1&1 Internet AG, Germany, http://www.1und1.de * <p/> * License: * commercial * <p/> * Authors: * Antonel (Tony) Pazargic (antonel.pazargic@1and1.ro) * <p/> * Date: 5/14/12 * Time: 9:13 AM * <p/> * *********************************************************************** */ public class DeassociateBeanPostProcessor extends ProxyConfig implements BeanPostProcessor, BeanClassLoaderAware, InitializingBean, Ordered { private int order = Ordered.HIGHEST_PRECEDENCE; private Class<? extends Annotation> deassociateAnnotationType = Deassociate.class; private DeassociatePointcutAdvisor deassociatePointcutAdvisor; private ClassLoader classLoader = ClassUtils.getDefaultClassLoader(); public Class<? extends Annotation> getDeassociateAnnotationType() { return deassociateAnnotationType; } public void setDeassociateAnnotationType(Class<? extends Annotation> deassociateAnnotationType) { this.deassociateAnnotationType = deassociateAnnotationType; } @PostConstruct public void afterPropertiesSet() throws Exception { this.deassociatePointcutAdvisor = new DeassociatePointcutAdvisor(); if (this.deassociateAnnotationType != null) { this.deassociatePointcutAdvisor.setAnnotationType(deassociateAnnotationType); } } public int getOrder() { return order; } public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof AopInfrastructureBean) { // Ignore AOP infrastructure such as scoped proxies. return bean; } Class<?> targetClass = AopUtils.getTargetClass(bean); if (AopUtils.canApply(this.deassociatePointcutAdvisor, targetClass)) { if (bean instanceof Advised) { ((Advised) bean).addAdvisor(this.deassociatePointcutAdvisor); return bean; } else { ProxyFactory proxyFactory = new ProxyFactory(bean); // Copy our properties (proxyTargetClass etc) inherited from ProxyConfig. proxyFactory.copyFrom(this); proxyFactory.addAdvisor(this.deassociatePointcutAdvisor); return proxyFactory.getProxy(this.classLoader); } } else { // This is not a repository. return bean; } } public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } }