AOP是一种思想:在不影响原来业务类情况下,实现动态增强。
而Spring中的AOP是基于动态代理实现的,即 JDK动态代理和Cglib动态代理。动态代理可以基于接口(JDK)或者类(cglib),如果是类就是cglib,spring默认是JDK。
本文阐述关系:动态代理实现AOP,AOP应用在声明式事务。
动态代理
有没有可能不编写实现类,直接在运行期创建某个interface的实例呢?
这是可能的,因为Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。
什么叫运行期动态创建?听起来好像很复杂。所谓动态代理,是和静态相对应的。我们来看静态代码怎么写:
还有一种方式是动态代码,我们仍然先定义了接口Hello,但是我们并不去编写实现类,而是直接通过JDK提供的一个Proxy.newProxyInstance()创建了一个Hello接口对象。这种没有实现类但是在运行期动态创建了一个接口对象的方式,我们称为动态代码。JDK提供的动态创建接口对象的方式,就叫动态代理。
什么是AOP
AOP在Spring中的作用(声明式事务)
编程式事务:所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务:管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于注解的方式),便可以将事务规则应用到业务逻辑中,这样spring容器就会自动的扫描声明过的方法,自动的加入事务的开启 提交 回滚 操作。我们可以更加专注于我们的业务逻辑。。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
1.传播行为
2.隔离级别
3.只读提示
4.事务超时时间
我们不用动态代理来实现AOP,而是用Spring来实现
把所有类交给spring管理(注册到spring)
切入点
日志做日志的事情,业务做业务的事情,没有干扰,通过spring进行aop切入–在哪个地方执行哪个方法
方式一:通过原生spring的API接口实现aop【主要是通过实现SpringAPI接口实现】
方式二:自定义来实现AOP【主要是切面定义】
自定义一个类实现了一个前置增强和后置增强方法作为一个切面
切面里的方法就是通知
把切面切入到切入点(切入点就是切面的方法要插入的位置,即把切面的通知放在切入点的前后位置处)
自定义一个类,通过配置他就可以作为切面
前面第一种方式没有切面,只需要定义一个类实现它的接口,他就知道在哪执行了
横切关注点:与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 …(日志就是我们的横切关注点)
切面(ASPECT):横切关注点被模块化成的一个类。
通知(Advice):切面中的方法。
目标(Target):被通知对象。
代理(Proxy):向目标对象应用通知之后创建的对象。
切入点(PointCut):切面通知 执行的 “地点”的定义。(即在哪个地方执行)
连接点(JointPoint):与切入点匹配的执行点。
方式三:使用注解方式实现AOP