《Spring框架AOP笔记---动力节点》

《Spring框架AOP笔记---动力节点》

AOP的引入实例

   假设一个类StudentServiceImpl实现了IService接口中doSome、doOther方法,同时又事务处理、日志处理的业务代码。
在这里插入图片描述
如果我有其他的类也想复用事务处理、日志处理的代码,怎么办
  我们可以把事务处理、日志处理单独作为一个工具类的静态方法。
在这里插入图片描述
在这里插入图片描述
  这样直接调用即可,但是你会发现业务方法和非业务方法还是耦合在一起,在主业务代码中会出现大量的交叉业务逻辑代码调用语句,大大影响了主业务逻辑的可读性。

在这里插入图片描述
有什么办法让业务方法处只做业务处理,并在不修改业务方法前提下增加日志与事务功能
  动态代理正是在不修改主业务逻辑的前提下,扩展和增强其功能通过实现InvocationHandler接口创建一个新的Handler(也有地方称为处理器对象)来使用动态代理,而调用新Handler的invoke方法可以获取目标方法的访问,调用
在这里插入图片描述
主程序:创建代理类,代理类执行doOther,会在目标方法doOther前后增加事务、日志功能。
在这里插入图片描述
在这里插入图片描述
  面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切而织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志等。
  若不使用AOP,则会出现代码纠缠,即交义业务逻辑与主业务逻辑混合在一起。这样,会使主业务逻辑变的混杂不清。例如,转账,在真正转账业务逻辑前后,需要权限控制、日志记录、加载事务、结束事务等交义业务逻辑,而这些业务逻辑与主业务逻辑间并无直接关系。但它们的代码量所占比重能达到总代码量的一半甚至还多。它们的存在,不仅产生了大量的“兀余”代码,还大大干扰了主业务逻辑一转账。

AOP中核心概念

  • 切面: 切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。,常用的切面有通知与顾问。实际就是对主业务逻辑的一种增强。
  • 织入: 织入是指将切面代码插入到目标对象方法执行的前后。上例MylnvocationHandle:类中的invoke()方法完成的工作,就可以称为织入。
  • 连接点:可以被切面织入的具体方法,通常业务接口中的方法均为连接点
  • 切入点:声明的一个或者多个连接点的集合, 切入点指切面具体织入的位置。在StudentServicelmpl类中,若doSome()将被增强,而doOther()不被增强,则doSome()为切入点,而doOther()仅为连接点。被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。
  • 通知Advice: 通知是切面的一种实现,可以完成简单织入功能(织入功能就是在这里完成的)。上例中的MylnvocationHandler就可以理解为是一种通知。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是日标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同
    切入点定义切入的位置,通知定义切入的时间

AspectJ对AOP的实现

  在Spring中使用AOP开发时,一般使用AspectJ的实现方式。 AspectJ是一个而向切面的框架,它已扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

AspectJ中常用的通知有五种类型:

  • (1)前置通知
  • (2)后置通知
  • (3)环绕通知
  • (4)异常通知
  • (5)最终通知: 其中最终通知是指,无论程序执行是否正常,该通知都会执行。类似于try…catch中的finally代码块。

在这里插入图片描述
  例如:public void com.bjpowernode.service.SomServiceImpl.doSome() throws Exception 就是一个切入点表达式
    public:访问权限类型
    void :返回值类型
    com.bjpowernode.service.SomServiceImpl:全限定类名
    doSome():方法名
     throws Exception 抛出类型
  切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达式中明显就是方法的签名。注意,表达式中加[]的部分表小可省略部分,各部分间用空格分开。在其中可以使用以下符号:
        在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实现AOP框架有很多:
  Spring框架实现AOP,Spring使用接口表示切面,使用方式比较笨重
  aspectj框架实现aop,aspectj可以使用注解和XML配置文件实现aop
步骤一:导入jar
使用aspectj框架的准备工作:
1、加入支持aop的jar
  1>spring-aop.jar
  2>aspectj框架对aop的实现jar:aspectjrt.jar ,aspectweaver.jar
2、加入新的约束文件spring-aop.xsd
3、spring的核心:spring-beans.jar,spring-core.jar,spring-context.jar,spring-expression.jar
4、日志commons-logging.jar
可选的:日志实现log4j.jar 单元测试:junit.jar
步骤二:定义目标类 实现业务接口
此处定义接口:SomeService ,实现类SomeServiceImpl
在这里插入图片描述
步骤三:定义切面类,在切面类中定义方法实现切面功能
1、在类的上面加入@Aspect,表示当前类是切面类
2、在类中自定义方法,实现切面的功能。在方法上面加入AspectJ框架的通知注解,例如@Before(value=“aspectj框架自己的切入点表达式”)
定义一个切面类MyAspect:
在这里插入图片描述
步骤四:定义spring的配置文件
1、加入约束文件spring-beans.xsd,spring-context.xsd,spring-aop.xsd
2、声明组件扫描器,用注解方式创建对象
3、声明切面类对象,把对象交给spring创建和管理
4、声明自动代理生成器,自动代理生成器是aspectj框架的一个功能,根据目标对象和切面类生成符合条件的所有代理对象。aspectj会修改目标对象,加入切面功能,所有目标对象实际就是代理对象
在这里插入图片描述

步骤五:从spring获取目标对象(aspectj已经将目标对象修改为代理对象)执行业务方法,实现功能增强

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41262453/article/details/90729114