一、核心问题
- AOP如何创建动态代理类(动态字节码技术)
- Spring工厂如何创建加工代理对象
通过原始对象的id值获得代理对象
二、动态代理类的创建
- JDK的动态代理
- Proxy.proxyNewInstance()方法的参数详解


编码
public static void main(String[] args) {/** 1.借用类加载器 TestJDKProxy或UserServiceImpl* 2.JDK 8.0 以前,内部类使用的外部类变量需要加final限定符,JDK8.0以后不再需要* */// 创建原始对象UserService userService=new UserServiceImpl();//创建JDK动态代理InvocationHandler handler= new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("-------log--------");//原始方法运行Object ret=method.invoke(userService,args);return ret;}};UserServiceProxy userServiceProxy= (UserServiceProxy) Proxy.newProxyInstance(TestJDKProxy.class.getClassLoader(),userService.getClass().getInterfaces(),handler);userServiceProxy.login("zhangsan","123456");userServiceProxy.register(new User());}}
- CGLIB的动态代理
- CGLIB创建代理的原理:父子继承关系创建代理对象,原始类作为父类,代理类作为子类,这样既可保证二者方法一致,同时可在代理类中提供额外功能

CGLIB的编码 ```java public class TestCglib { public static void main(String[] args) { // 1.创建原始对象 UserService userService=new UserService(); /*
- 2.通过CGLIB创建动态代理对象
- Proxy.newProxyInstance(classloader,interface,invocationHandler);
- Enhancer.setClassLoader();
- Enhancer.setSuperClass();
- Enhancer.setCallback(); —->MethodInterceptor(cglib)
- Enhancer.create()——>代理
*/ Enhancer enhancer=new Enhancer(); enhancer.setClassLoader(UserService.class.getClassLoader()); enhancer.setSuperclass(UserService.class);
MethodInterceptor methodInceptor=new MethodInterceptor(){ // 等同于InvocationHandler——invoke @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("TestCglib.intercept");Object ret=method.invoke(userService,objects);return ret;
} };
enhancer.setCallback(methodInceptor);
UserService userServiceProxy= (UserService) enhancer.create(); userServiceProxy.login(“libai”,”123456”); userServiceProxy.register(new User()); } }
3. 总结- JDK动态代理 Proxy.newProxyInstance() 通过接口创建代理的实现类- Cglib Enhancer 通过继承父类创建的接口类三、Spring工厂如何加工原始对象<br />思路分析:<br /><br />编码:```javapublic class BeanPostProcessorProxy implements BeanPostProcessor {@Override/** Proxy.newProxyInstance();* */public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {InvocationHandler handler=new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("-----postProcessAfterInitialization----log-----");return method.invoke(bean,args);}};return Proxy.newProxyInstance(BeanPostProcessorProxy.class.getClassLoader(),bean.getClass().getInterfaces(),handler);}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}}
<bean id="userService" class="com.baizhi.factory.UserServiceImpl"/><!--1.实现BeanPostProcessor进行加工2.配置文件中对BeanPostProcessor进行配置--><bean id="beanPostProcessorProxy" class="com.baizhi.factory.BeanPostProcessorProxy"/>
