一:SPring Aop是什么?
Spring aop全称 aspect object pramming 又叫面向切面编程
1.面向切面编程是指 对很多功能都有的重复代码进行抽取,并在运行的时候往业务相应的方法上植入“切面类代码”,
重复代码,在spring aop中被称为关注点;
常见的关注点:比如我们写一个功能模块,增,删,改,那么我们这些方法都有相同的地方,比如,开启事务,提交事务,关闭事务,那么我们就可以把这些重复代码提取出来放到另外的类中,那么这个类由关注点组成,就叫切面类
切入点:
- 执行目标对象方法,动态植入切面代码。
- 可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。
切入点表达式:
- 指定哪些类的哪些方法被拦截(就是说执行哪些方法的时候拦截并执行切面类中的代码)
2,aop的优点:
aop把一些重复代码拿出来放到特定类中,只写一次,我们只需要关注业务逻辑代码,不必每次重复写这些代码,降低了代码的耦合性,提高了隔离性,
3.aop的一些名词:
Aspect
(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 切点 以及相应的 Advice。Joint point
(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。Pointcut
(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。Advice
(增强):Advice 定义了在代理对象 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在加入的目标对象之前、之后还是代替执行的代码。Target
(目标对象):织入Advice
的目标对象.。Weaving
(织入):将Aspect
和其他对象连接起来, 并创建Advice
d 对象的过程
3.aop的实现过程:
我们将重复代码放入切面类后,然后利用aop将其与代理对象(Spring容器生成的都是代理对象)关连起来,等到执行特定方法的时候来调用切面类中的方法,这个过程中就是由Aop来帮我们完成的,aop会监听表达式中配置的相应方法的运行,并根据织入的对象方法来执行相应的方法(一般有运行前,运行后等)。(Aop的实现的核心机制之一就是动态代理,所以代理对象是绕不过的,顺便说下代理对象,假如我们把一个目标对象加载到spring容器之中,生成的就是代理对象,spring根据目标对象的不同,实现代理对象的方式也会不同,Spring的代理对象分别是采用jdk代理和cglib代理来实现的,假如目标对象实现了接口,那么系统采用的就是jdk方式来实现动态代理,反之,就使用cglib来实现动态代理,jdk实现的代理对象跟目标对象有相同的父类,就相当于平级),而cglib实现的代理对象相当于目标对象的子类,因此如果采用cglib的话目标对象不能使用final来修饰,顺便说一下,如果目标对象实现了接口其实也可以强制使用cglib来实现的,不过一般不这么用),
aop的具体实现:
举个例子:我们在a中(目标对象)定义了一个简单的功能业务,
package cn.oracle.services;
public class ProductserviceImpl {
//测试无实现接口来完成切面注解
public void SaveProduct(){
System.out.println("商品存储进行中");
}
}
然后我们又定义了一个切面类
然后我们将这个切面类和目标类关联起来(也就是织入目标对象),。
测试一下:
结果