什么是aopjava
AOP(Aspect-OrientedProgramming,面向方面编程),能够说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP容许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码每每水平地散布在全部对象层次中,而与它所散布到的对象的核心功能毫无关系。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它致使了大量代码的重复,而不利于各个模块的重用。程序员
而AOP技术则偏偏相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减小系统的重复代码,下降模块间的耦合度,并有利于将来的可操做性和可维护性。web
aop使用场景spring
aop框架种类编程
使用aop能够作的事情有不少。缓存
观察一下传统编码方式与使用aop的区别 微信
核心概念mvc
描述AOP经常使用的一些术语有通知(Adivce)、切点(Pointcut)、链接点(Join point)、切面(Aspect)、引入(Introduction)、织入(Weaving)、通知(Advice)等。app
简单例子框架
相比xml配置,基于注解的方式更加简洁方便。
@Aspect public class TransactionDemo { @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))") public void point(){ } @Before(value="point()") public void before(){ System.out.println("transaction begin"); } @AfterReturning(value = "point()") public void after(){ System.out.println("transaction commit"); } @Around("point()") public void around(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("transaction begin"); joinPoint.proceed(); System.out.println("transaction commit"); } }
在applicationContext.xml中配置。
<aop:aspectj-autoproxy /> <bean id = "transactionDemo" class = "com.yangxin.core.transaction.TransactionDemo" />
spring aop原理
经过前面介绍能够知道:AOP 代理实际上是由 AOP 框架动态生成的一个对象,该对象可做为目标对象使用。AOP 代理包含了目标对象的所有方法,但 AOP 代理中的方法与目标对象的方法存在差别:AOP 方法在特定切入点添加了加强处理,并回调了目标对象的方法。
Spring 的 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。所以,AOP 代理能够直接使用容器中的其余 Bean 实例做为目标,这种关系可由 IoC 容器的依赖注入提供。
aop开发时,其中须要程序员参与的只有 3 个部分:
为了理清关系,先来个类关系图。
两种动态代理方式
Spring默认采起的动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用CGlib机制。
Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪一种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是若是目标类是接口,则使用JDK动态代理技术,不然使用Cglib来生成代理。
JDK动态代理
JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,经过实现该接口定义横切逻辑,并经过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一块儿。
Proxy利用InvocationHandler动态建立一个符合某一接口的实例,生成目标类的代理对象。
CGLib动态代理
知识拓展
经过上面的分析,你们是否有种熟悉的感受,彷佛和拦截器、过滤器的功能类似。那么问题来了,aop与拦截器、过滤器是什么关系。
先来回顾一下拦截器与过滤器。以下图一网友的测试,在web.xml中注册了TestFilter1和TestFilter2。而后在spring的配置文件中配置了BaseInterceptor和TestInterceptor。获得的结果以下图所示。从图中能够看出,拦截器和过滤器都横切了业务方法,看似符合aop的思想。
Filter过滤器:拦截web访问url地址。 Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问。 Spring AOP拦截器:只能拦截Spring管理Bean的访问(业务层Service)
写在最后
下篇文章将会写Spring cache的内容,一样以思惟导图的方式编写。可视化学习,让java再也不难懂。
最后的最后,欢迎关注个人微信公众号java思惟导图,下载导图源文件,以及更多java思惟导图与项目资料供你学习,带你走进记忆脑图的世界。
关注公众号并回复“思惟导图”当即下载源xmind导图。
上篇文章阅读