AOP面向切面编程

AOP面向切面编程


23a3fc7f3229affeaac5e002bef8f2699d5.gif


  1. AOP概念

    1. 简介

    2. 内部原理

    3. JDK动态代理

    4. CgLib动态代理

    5. 相关术语

  2. Spring-aop使用

    1. 搭建项目

    2. 编写切面类

    3. 配置

  3. aop配置

    1. 切入点

    2. 切面

  4. aop注解方式




1 AOP概念 6b3f3a0407b9ac7ce90f1f3b28d5bc804e3.gif

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。



AOP内部原理(动态代理)


在传统开发中去增强一个方法的功能,是采用纵向继承的方式给方法加上扩展功能,缺点是需求变化时就需要去修改业务类方法中的内容(去掉扩展功能或者换成另一个功能)

2be52d2a919301d2cfd98d38843693805c1.jpg


而采用AOP则是生成代理类来增强功能,不用修改原类

73b42161762621cc8d6afcdcfc20ffb273a.png


JDK动态代理


使用JDK动态代理需要实现接口的类才能被动态代理

5aec17932e7bc2627262b80ff15f88954e4.png

给work方法增加study功能

84a57d1535461582e53bbb458f8b0c4e20f.png


测试

baef8f76bd88d8516ec17a0197ca6b7ad9a.png

62b1d969ccac7e947f70d8a23a63a9c979e.png


cglib动态代理


cglig是一个第三方开源代码 生成类库,动态添加类的属性和方法。在spring的核心包当中已经引入了cglib,采用的是继承方式来产生的代理对象


b6fc715dd140f7e394121bf79d5d36965f4.png


Spring的AOP简介


AOP思想最早是由AOP联盟组织提出的

Spring使用这种思想最好的框架

AspectJ

Spring的AOP有自己的实现方式,但是这种方式非常繁琐

AspectJ 是一个AOP的框架

Spring放弃了自己传统的方式 ,引入AspectJ作为自身AOP的开发



相关术语



1.Joinpoint:连接点

可以被拦截到的方法

能够被增强的方法,这些方法就可以称为是连接点

比如下面的work方法就是接入点,它可以被增强

147e3a96891120994624af2053f9ab3bddb.png


2.Pointcut:切入点

连接点是可以被增强的方法,切入点是已经被增强了的方法

6611e9a5c159af3be3bc4fd86124d8c5882.png



3.Advice:通知

增加的内容,通常都是封装成一个方法, 这个方法我们就称为通知

cc7aeaa6ab1cc4c8f846862d075bb35c7e8.png

4.Introduction:引介

类层面的增加

给原有的类添加一些新的属性方法

在开发中通常都是给方法进行增加


5.Target:被增加的对象


6.Weaving:织入,将通知应用到目标对象的过程


7.Proxy:代理对象


8.Aspect:切面,多个通知和多个切入点的集合





2 Spring-AOP使用 6b3f3a0407b9ac7ce90f1f3b28d5bc804e3.gif

新建项目-导包-配置文件


后四个是Spring核心包,前面是AOP需要的

d4954bd370d287043fb186888eb54e0712b.png


配置AOP有关约束

applicationContext.xml

aefdb85061e3d5f28de0de1467c7f661c35.jpg


编写切点与切面类


把work方法作为切入点

f2ba63cb9860c11c18b08a1392e133ef594.png

然后有一个切面里面有多个通知

68944392f288d12a8257e993e41254b8979.png

配置(指定哪个切入点添上哪个通知)

0d7b07ef6c1eeec4580730142a5330e690c.jpg

测试

1eb5a304d45becb0ac1bfc28d532607f290.png

结果(添加成功)

15aeea354ab44314e630ed110ceac5db1e7.png


3 AOP配置 6b3f3a0407b9ac7ce90f1f3b28d5bc804e3.gif

配置切入点

0208cdd2c8e8126f002d81fc80b483592a6.png

id给每个切入点取的唯一标识,expression指定切入点通过execution函数来完成:【访问修饰符】 方法返回值 包名.类名.方法名(参数)


切入面配置

a17bc17954f90ded8894c77a96a9c9f6baa.png

ref指定切入面:前面配置好的id名

method:选择哪个通知

poincut-ref:选择加到哪个切入点(切入点的id)


通知类型

before:前置通知,即在原方法体前加上通知

after-returning:后置通知

around:环绕通知,前后都加一条

after-throwing:异常通知,程序异常时加上此通知

after:最终通知,原方法有无异常通知都会执行上去


4 AOP注解方式ApsectJ开发 6b3f3a0407b9ac7ce90f1f3b28d5bc804e3.gif

在配置文件开启使用

544a3b12e27e7731e4404215a23cf534c5d.png


在切面类的通知上添加注解


把通知2添加到work方法

e5d613329c381d4eac4416226e90ce0c747.png


注解AOP通知类型

@Before前置通知

@AfterReturning后置通知

@Around环绕通知

@AfterThrowing异常抛出通知

@After最终通知




本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

posted @ 2019-10-01 14:07  木瓜煲鸡脚  阅读(36)  评论(0)    收藏  举报