什么是AOP
AOP的应用场景
如在保存到数据库前需要加上一个权限校验的方法。
以前在每个Dao上去加这个方法,不实际,后来采用了继承的方式,便只是需要修改这个Dao的类就可以了,这是纵向继承的方式。
AOP采用的是横向抽取机制取代了传统纵向继承
横向抽取机制我们可以把它理解为一个代理机制,以前如果客户说要在save方法加入一个权限校验,像纵向继承,还要一个个去extend,如果客户还说不要了,还要一个个去删掉。而AOP如果我们想要在增加权限校验,生成所有dao的代理,访问这个代理对象,如果不想要,就把代理对象去掉就可以了。SpringAOP底层用的就是动态代理的机制,增强我们类里面的方法,但是这个代理在类里面不用我们自己写,只需要配置就可以了。
性能控制,在代码进入之前记录一个时间,在结束之后记录一个时间,算出程序的运行时间
Spring底层AOP的实现原理
动态代理:
JDK动态代理:只能对实现了接口的类产生代理。
Cglib动态代理:(类似于Javassist第三方代理技术):对没有实现接口的类产生代理对象。生成子类对象。
在Spring中,若类实现了接口,则默认采用JDK动态代理,若没有实现接口则默认Cglib。
Spring的AOP底层的实现
1.JDK动态代理
JDKProxy就是用JDK动态代理对UserDao产生的代理
第一个参数是类加载器,第二个参数是接口,第三个参数是真正干活的对象InvocationHandler //真正实现InvocationHandler的类对象
原理就是使用JDK原生的Proxy生成我们的代理,在invoke添加我们的方法,然后执行这个代理
2.Cglid动态代理
Cglib:第三方开源代码生成类库,动态添加类的属性和方法,
就是你已经有class(类了),它可以在你这个类基础上进行操作。由于是第三方的,所以要引入包,spring已经引入Cglib的包了
Cglid采用的是继承的方式去产生我们的代理对象,因此要设置父类
Spring的AOP的开发(AspectJ的XML的方式)
1.Spring的 AOP的简介
AOP思想最早是由AOP联盟组织提出的。Spring是使用这种思想最好的框架
早期SPring的AOP有自己实现的方式(由于非常繁琐)。AspectJ是一个AOP的框架,Spring引入AspectJ作为自身AOP的开发。
2.AOP相关术语
1.Joinpoint:连接点,可以被拦截的点,(可以被增强的方法)
2.Pointcut:切入点,真正被拦截的点(真正被增强的点)——
3.Advice:通知,增强,所增强的方法就叫为通知 (这是属于方法层面的增强)
4.Introduction:引介。类层面的增强
3.写完目标类并且配置完成之后,编写一个测试类,使用sping的junit便不用每次都重复创建工厂类
4.编写一个切面类,写入的是要增加的方法,并且将切面类交给Spring管理
这里表达式里save(…)代表任意参数,*代表的是任意返回值
1.前置通知
2.后置通知:可以获得方法的返回值,加入delete是String类型
3.环绕通知:可以阻止目标方法的执行
4.异常抛出通知
5.最终通知:相当于finally的内容
无论有没有异常,最终通知都会执行
切入点表达式的写法
基于execution的函数完成的
语法:
其中*号表示任意
表示这个包以及它子包下面的所有类的所有方法 …代表开头
+号代表当前的类和其子类
Spring的AOP的基于AspectJ注解开发
1.编写目标类,切面类并配置,并在切面类上使用注解,由于没实现接口,用的是Cglib
假设我有很多个通知都作用于同一个方法,但后来想让这些通知作用于不同的方法,就要到这里一个个去改方法名
这时就可以通过切入点配置去改
只需要改切入点里的方法就可以,就不用再@After,@around这些通知里面改方法
后置通知在注解上这样接收返回值,