Spring_详解AOP

Posted tunan-ki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring_详解AOP相关的知识,希望对你有一定的参考价值。

基本的概念

切面:Aspect

      在程序中就是一个类,该类中定义的方法就是要增强的功能。

连接点:JoinPoint

      切面中的每一个增强方法都是一个连接点

切入点:PointCut

      对哪个目标对象的哪些方法进行增强

目标对象:target

      要被增强的对象【原对象】

代理对象:proxy

      增强后的对象【代理对象与目标对象数据类型相同】

织入:wave

      将切面对目标对象进行增强

Spring如何写一个切面类?

      Advice:通知

      Advisor:顾问

Spring的AOP编程步骤

1. 通知实现aop编程

2. 添加jar包,aop、aopalliance-1.0

3. 写目标类和目标方法(比如:UserServiceImpl的remove和list方法)

4. 写切面中的通知类

5. 通知分类:

  前置通知:MethodBeforeAdvice

  后置通知:AfterReturningAdvice

  环绕通知:MethodInterceptor

  异常通知:ThrowsAdvice

本次需求:对UserServiceImpl的目标对象进行增强,在方法执行前进行权限校验

技术图片

 

6. 配置spring的配置文件

技术图片

 

7. 其他通知类型的案例:

创建切面类,实现对应的通知类型的接口

重写方法,定义要增强的功能

在spring的配置文件中创建切面类的对象

在spring中织入切面

技术图片

 技术图片

 

总结

通知的方式只能确定要增强的时间点【前置、后置…】

通知的方式会将目标对象的所有的方法全部进行增强

通知的方式如果要为多个目标对象进行增强,需要配置多次代理工厂

顾问实现aop编程

顾问主要解决的问题:可以通过配置实现让哪些目标对象的哪些方法进行哪些增强。

从方法名入手

spring提供了两种方式:

    org.springframework.aop.support.NameMatchMethodPointcutAdvisor

         org.springframework.aop.support.RegexpMethodPointcutAdvisor

顾问的开发

NameMatchMethodPointcutAdvisor

在通知的基础上新建一个顾问对象

技术图片

 

如果希望多目标对象的多个方法进行增强

技术图片

 

还可以用*来匹配方法名

技术图片

 

RegexpMethodPointcutAdvisor

技术图片

 技术图片

 

总结:

  解决个单个目标对象的多个目标方法增强同一方法的问题

  还需解决多个目标对象要增强需要配置多个代理工厂对象

  还需解决一个顾问不能为一个目标方法进行多种增强

spring中的自动代理

前面使用的代理工厂对象ProxyFactoryBean来创建代理对象,该对象一次只能创建一个需要的目标对象的代理对象,spring中还有可以自动生成代理对象的api

spring中代理对象的方式1:ProxyFactoryBean

      一次只能创建一个代理对象

spring中代理对象的方式2:BeanNameAutoProxyCreator

  org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

技术图片

 

用BeanNameAutoProxyCreator替换ProxyFactoryBean,实现了一个配置可以生成多个目标对象的代理对象,并且为代理对象取的bean的id值为目标对象的bean的id的值。

如果有很多个目标对象,配置beanNames用逗号隔开

或者

技术图片

 

spring中代理对象的方式3:DefaultAdvisorAutoProxyCreator

全自动代理

  org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator

spring而言,aop(面向切面编程)最好的方式:

      通知(四种)+顾问(两种)+ BeanNameAutoProxyCreator自动代理(三种)

回顾的博客:https://www.cnblogs.com/whgk/p/6627187.html

 

如果有了aspectj的jar包,spirng-aop可以简化

1、        写目标类

2、        写通知切面类

3、        配置spring配置文件

技术图片

以上是关于Spring_详解AOP的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOPSpring AOP之如何通过注解的方式实现各种通知类型的AOP操作进阶篇

[刘阳Java]_Spring入门_第1讲

源码学习之AOPSpring AOP使用

Spring原理篇(14)--Spring AOP源码的实现<一>

AOPSpring大法有多好约定编程

关于Spring——AOP