JAVA动态代理与AOP
1、AOP就是面向切面编程,我们可以从以下几个层面来实现AOP

2、在编译期修改源代码
在运行期字节码加载前修改字节码
在运行期字节码加载后动态创建代理类的字节码
1、以下是各种实现机制的比较:

1、Joinpoint:拦截点,如某个业务方法
Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint
Advice:要切入的逻辑
Before Advice:在方法前切入
After Advice:在方法后切入,抛出异常则不会切入
After Returning Advice:在方法返回后切入,抛出异常则不会切入
After Throwing Advice:在方法抛出异常时切入
Around Advice:在方法执行前后切入,可以中断或忽略原有流程的执行
公民之间的关系

2、织入器通过在切面中定义pointcout来搜索目标(被代理类)的JoinPoint(切入点),然后把要切入的逻辑(Advice)织入到目标对象里,生成代理类
1、动态代理
动态字节码生成
自定义类加载器
字节码转换
2、4.1 动态代理
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了
动态代理:即在运行期动态创建代理类,使用动态代理实现AOP需要4个角色:
被代理的类:即AOP里所说的目标对象
被代理类的接口
织入器:使用接口反射机制生成一个代理类,在这个代理类中织入代码
InvocationHandler切面:切面,包含了Advice和Pointcut

3、4.1.1 动态代理的演示
例子演示的是在方法执行前织入一段记录日志的代码,其中
Business是代理类
LogInvocationHandler是记录日志的切面
IBusiness、IBusiness2是代理类的接口
Proxy.newProxyInstance是织入器



4、执行结果:
记录日志执行业务逻辑2执行业务逻辑
5、4.1.2 动态代理的原理
本节将结合动态代理的源代码讲解其实现原理
动态代理的核心其实就是代理对象的生成,即Proxy.newProxyInstance(classLoader, proxyInterface, handler)
让我们进入newProxyInstance方法观摩下,核心代码就三行:

6、getProxyClass(loader, interfaces)方法用于获取代理类,它主要做了三件事情:
在当前类加载器的缓存里搜索是否有代理类
没有则生成代理
并缓存在本地JVM里
查找代理类getProxyClass(loader, interfaces)方法:

7、生成加载代理类:

8、代理类生成过程ProxyGenerator.generateProxyClass()方法的核心代码分析:

9、通过以上分析,我们可以推出动态代理为我们生产了一个这样的代理类。把方法soSomeThing的方法体修改为调用LogInvocationHandler的invoke方法
代码如下:
