spring框架中AOP思想与各种配置详解

梦里梦外; 2022-03-30 12:14 235阅读 0赞

Spring中提供两种AOP支持:

1.基于代理的经典AOP

2.Aspectj注解配置AOP


首先我们先了解什么是AOP,AOP(Aspect Oriented Programming)面向切面编程!**AOP采用了横向抽取机制(可能有人会说啥叫横向抽取机制,在这里先引入一个纵向继承的概念),取代了纵向继承的重复性代码(例如权限控制、性能监视、缓存)**

spring AOP使用纯Java实现,主要通过代理方式向目标类(被代理的类织入增强代码)

Aspectj 是一个基于Java语言的AOP框架

纵向继承:1229366-20171118013503749-2122032866.png

在图中,左边的传统的纵向继承方式,因为writelog在具体实现类userdao中无法被复用,所以此方法就被放到了所有的dao的父类BaseDao中

多态的特性,所有子类dao要加强代码时,经过父类的writelog方法,类似一种从上到下的关系;然而右边的是AOP思想下的代码增强,因为不

论是代理类UserDaoProxy,还是被代理类UserDao,都实现了同一个接口或是同一个父类,属于兄弟关系,实现了所谓的“横向”的切入机制!

而对于AOP中的一些术语,我觉得你们需要了解一下,以便于对下面的阅读有帮助!

1229366-20171118014412359-738982107.png针对这个图再补充一下,一个切点和一个advice的组合叫advisor!!

(1) 基于代理的经典AOP

**通知:advice**

Spring提供了 前置通知、环绕通知、后置通知、异常通知等等。

这些advice分别对应要实现的接口:MethodBeforeAdvice、MethodInteceptor、AfterReturningAdvice、ThrowsAdvice

就拿前置通知来举例子:

1229366-20171118015455296-152191263.png

这是在xml中的各个类的配置

1229366-20171118015934249-1119879403.png

但其实你们会发现,我这里的advice没有指定要对哪个方法执行增强,因为dao可能会有好几种方法,但是有些并不需要增强,所以一,我们就需要一个带有特定切点的advice!

基于以上的配置进行修改,带有切点的切面!!

1229366-20171118020906687-1536926466.png

一个切点和一个advice的组合:advisor

带有切点的切面,只需要在以上配置中再加一个:

1229366-20171118021354671-629020101.png之后在配置代理类时,把interceptorname换位这个带有切点的切面id

但是有没有发现前面的配置中,每一步生成代理类时,都需要主动去配置proxyFactoryBean来生成代理类,这样做很麻烦,所以这里又要引入**自动代理的概念!!**

1229366-20171118021934406-318072713.png

1229366-20171118022301234-1645153305.png

  1. ![1229366-20171118022408702-1214479996.png][]
  2. ** *****(2) Aspectj配置AOP(推荐使用)***

1229366-20171118023645077-444444856.png

2.1基于Aspectj注解形式

第一步:引入相应的jar包

1229366-20171118024258531-353023680.png

第二步:以Aspectj形式编写

1229366-20171118024452265-593035003.png

第三步:创建xml文档:

1229366-20171118024716093-2101879297.png

**2.2基于Aspectj的xml形式配置**

1229366-20171118025432624-98020074.png

这是以xml形式编写的aspect配置



转自:https://www.cnblogs.com/Booker808-java/p/7855672.html

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读