- 1、本文档共20页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AOP的实现机制教程
1、 AOP各种的实现
AOP就是面向切面编程,我们可以从几个层面来实现AOP。
在编译期修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较。?
?
类别机制原理优点缺点静态AOP静态织入在编译期,切面直接以字节码的形式编译到目标字节码文件中。对系统无性能影响。灵活性不够。动态AOP动态代理在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。相对于静态AOP更加灵活。切入的关注点需要实现接口。对系统有一点性能影响。动态字节码生成在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。没有接口也可以织入。扩展类的实例方法为final时,则无法进行织入。自定义类加载器在运行期,目标加载前,将切面逻辑加到目标字节码里。可以对绝大部分类进行织入。代码中如果使用了其他类加载器,则这些类将不会被织入。字节码转换在运行期,所有类加载器加载字节码前,前进行拦截。可以对所有类进行织入。?2、 AOP里的公民 ?
Joinpoint:拦截点,如某个业务方法。
Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint。
Advice:? 要切入的逻辑。
Before Advice 在方法前切入。
After Advice 在方法后切入,抛出异常时也会切入。
After Returning Advice 在方法返回后切入,抛出异常则不会切入。
After Throwing Advice 在方法抛出异常时切入。
Around Advice 在方法执行前后切入,可以中断或忽略原有流程的执行。 ?
公民之间的关系 织入器通过在切面中定义pointcut来有哪些信誉好的足球投注网站目标(被代理类)的JoinPoint(切入点),然后把要切入的逻辑(Advice)织入到目标对象里,生成代理类。
3 AOP的实现机制?? 本章节将详细介绍AOP有各种实现机制。
3.1 动态代理 ? Java在JDK1.3后引入的动态代理机制,使我们可以在运行期动态的创建代理类。使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类,然后在这个代理类中织入代码。被代理的类是AOP里所说的目标,InvocationHandler是切面,它包含了Advice和Pointcut。 3.1.1 使用动态代理 ? 那如何使用动态代理来实现AOP。下面的例子演示在方法执行前织入一段记录日志的代码,其中Business是代理类,LogInvocationHandler是记录日志的切面,IBusiness, IBusiness2是代理类的接口,Proxy.newProxyInstance是织入器。 清单一:动态代理的演示
Java代码 ? HYPERLINK /topic/javascript:void() \o 收藏这段代码
public?static?void?main(String[]?args)?{???
????//需要代理的接口,被代理类实现的多个接口都必须在这里定义???
????Class[]?proxyInterface?=?new?Class[]?{?IBusiness.class,?IBusiness2.class?};???
????//构建AOP的Advice,这里需要传入业务类的实例???
????LogInvocationHandler?handler?=?new?LogInvocationHandler(new?Business());???
????//生成代理类的字节码加载器???
????ClassLoader?classLoader?=?DynamicProxyDemo.class.getClassLoader();???
????//织入器,织入代码并生成代理类???
????IBusiness2?proxyBusiness?=?(IBusiness2)?Proxy.newProxyInstance(classLoader,?proxyInterface,?handler);???
????//使用代理类的实例来调用方法。???
????proxyBusiness.doSomeThing2();???
????((IBusiness)?proxyBusiness).doSomeThing();???
}???
/**??
*?打印日志的切面??
*/???
public?static?class?LogInvocation
文档评论(0)