分享

Java

 PaladinL_WL 2018-01-19

好的各位小伙伴

虽然今天是周六

我们还是不能松懈

好的开始今天的分享

来一起看一下吧


AOP 是什么



AOP 是 Aspect-oriented programming 面向切面(方面)的编程的简写,可以把业务逻辑和系统级的服务进行隔离,使业务逻辑跟各个系统级服务的耦合度降低,提高程序的重用性和开发效率


业务逻辑就是某个类的某个方法本身要实现的功能。比如我们之前写的 studentservice 里面实现的增删改查就是业务逻辑!



系统级的服务像系统的日志,事务,权限验证

系统日志会记录什么人在哪一天什么时间做了哪些操作

权限验证就是验证我们的权限,还记得我们之前的聊天室的踢人功能吗?只有 admin才可以踢人

事务这个概念,今天暂时先放一下,在之后做例子的时候会演示给大家的!


那么现在把这些系统级服务的插入进我们的功能代码中,用一行输出语句代表我们的业务逻辑,在执行一个操作之前,要先进行权限验证,验证通过之后,再来执行我们的操作,操作完成后,记录日志。


小伙伴们自己想一下为什么是这个顺序?

 

这是在没有 AOP 之前,我们每个功能都要这么去添加系统级服务,要是这个项目有一千个类,你就去加吧,至少一周不用干别的了,就是复制代码!


现在我们有了 AOP 就可以不用这么麻烦了


AOP 的底层原理  



AOP 的底层实现的原理:动态代理




首先是实例化我们要代理的目标类 target, 然后在生成一个动态代理 proxy ,这个方法里面有三个参数,我们的目标类,目标类的接口,实现 invocation 接口。实现接口的同时需要实现里面的方法!这个方法里,有我们的代理对象,方法和参数



我已经把验证和日志都注释掉了



只要我们的测试结果中有我们标注的这两行,证明我们成功的插入了系统级服务!



测试结果:



看着很麻烦是不是,当然我们在实际的开发中不会去手动的生成代理,这里只是给大家演示 AOP 的底层原理,要是这么麻烦我们还不如直接在代码里面插入服务了。


注意动态代理有两种方式:jdk动态代理 /cglib动态代理

jdk 的动态代理机制只能代理实现了接口的类

cglib 的动态代理既可以代理实现了接口的类,也可以代理没有实现接口的类


AOP一些专业术语



切面(Aspect): 就是交叉在各个业务逻辑中的系统服务,类似于安全验证,事务处理,日志记录都可以理解为切面。

织入(weaving) :就是将切面代码插入到目标对象某个方法的过程,相当于我们在jdk动态代理里面的 invocationHandler接口方法的内容 。

连接点(JointPoint) :理论上可能被切面织入的所有方法 ,比如 addStudent...通常所有方法都可以被称为连接点。

切入点(PointCut) :就是实际上被切面织入的方法。

目标对象(target) :就是切入点和连接点所属的类 StudentService。

通知(Advice): 就是切面的实现,切面织入的目标对象,时间点(方法执行前 ,后,前后,异常)以及内容。

顾问(Advisor) :其实就是通知的一个封装和延伸,可以将通知以更为复杂的方式织入到某些方法中。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多