滁州网站设计,重庆平台网站建设工作,网站迁移,如何做增加网站留存的营销活动上文中#xff1a;https://blog.csdn.net/qq_26437925/article/details/145241149 大致了解了spring aop的代理的实现#xff0c;其实就是有个BeanPostProcessor代理了bean对象。 本文直接编写最简单的代码直观感受下
bean A:
Service
public class A {public A() {System.…上文中https://blog.csdn.net/qq_26437925/article/details/145241149 大致了解了spring aop的代理的实现其实就是有个BeanPostProcessor代理了bean对象。 本文直接编写最简单的代码直观感受下
bean A:
Service
public class A {public A() {System.out.println(A());}public void say(){System.out.println(say A);}
}beanPostProcessor
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Service;import java.lang.reflect.Method;Service
public class ABeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals(a)) {System.out.println(a BeanPostProcessor postProcessAfterInitialization);return getProxy(bean);}return bean;}public Object getProxy(Object targetObject) {Enhancer enhancer new Enhancer();Class? superClass targetObject.getClass();enhancer.setSuperclass(superClass);MethodInterceptor interceptor new MethodInterceptor() {Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(cglib before...);Object res methodProxy.invokeSuper(o, objects);return res;}};enhancer.setCallback(interceptor);Object targetProxy enhancer.create();return targetProxy;}
}
基于cglib代理
dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version
/dependencyconfig类不用EnableAspectJAutoProxy了
Configuration
ComponentScan(com.aop.dependency)
public class ConfigOne {
}测试类
Test
public void test() throws Exception {ApplicationContext ctx new AnnotationConfigApplicationContext(ConfigOne.class);A a (A) ctx.getBean(a);a.say();((AnnotationConfigApplicationContext) ctx).close();
}
测试输出
方法执行的代理输出正常
因为Cglib是用父类继承新增了一个完整的class字节码。所以可以看到A()构造函数执行了两次, 一次是spring bean生命周期的实例化一次则是Cglib创建出代理对象执行的。