10.面向切面编程

1.相关概念介绍:
(1)横切关注点:散布于应用中多处的功能。
(2)切面:横切关注点可以被模块化为特殊的类。
(3)描述切面的术语有通知,连接点,切点。
2.使用面向切面编程的好处
(1)每个关注点都集中于一个地方,而不是分散到多处代码中。
(2)服务模块更加简洁,因为它们只包含主要关注点的代码,而次要关注点的代码被转移到切面中。
3.通知advice
(1)定义:切面的工作被叫做通知。
(2)spring切面可以应用5种类型的通知
a.前置通知:在目标方法被调之前调用该通知。
b.后置通知:在目标方法完成之后调用通知,不关心输出的内容。
c.返回通知:在目标方法成功执行之后调用通知。
d.异常通知:在目标方法抛出异常后调用通知。
e:环绕通知:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
(3)连接点:就是通知应用的时机。
(4)连接点是在应用执行过成功能够插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为。
4.切点
(1)切点有助于缩小切面所需要通知的连接点的范围。
(2)切点的定义会匹配通知所要织入的一个或者多个连接点。通常使用明确的类或者方法名称或者利用正则表达式定义所匹配的类和方法名称来指定这些切点。
5.切面
(1)切面是通知和切点的结合。通知和切点共同定义了切面的全部内容,是什么以及在什么时间地点完成功能。
6.引入
允许我们向现有类添加新方法或者属性。
7.织入
把切面应用到目标对象并且创建新的代理对象的过程。切面在指定的连接点处被织入目标对象中。其中目标对象的生命周期中有多个点可以进行织入:
(1)编译期
切面在目标类编译的时候就被织入。此方式是AspectJ织入对象的方式。
(2)类加载期
切面在目标类加载到JVM时被织入,该方式需要ClassLoader来支持。
(3)运行期
切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象。此方式是Spring AOP织入对象的方式。
8.Spring提供了4中类型的AOP支持:
(1)基于代理的经典Spring AOP
(2)纯POJO切面
(3)@AspectJ注解驱动的切面
(4)注入式AspectJ切面
9.因为Spring基于动态代理,所以spring只支持方法连接点。
10.通过切点来选择连接点
(1)Spring仅支持AspectJ切点指示器的一个子集,下面列出了Spring AOP所支持的AspectJ切点指示器:
arg():限制连接点匹配参数为指定类型的执行方法。
@args():限制连接点匹配参数由指定注解标注的执行方法。
execution():用于匹配是连接点的执行方法。
this():限制连接点匹配AOP代理的bean引用为指定类型的类。
target:限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的位置。
@target():限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注释
within():限制连接点匹配指定的类型。
@within():限制连接点匹配指定注解所标注的类型。
@annotation:限定匹配带有指定注解的连接点。
11.我们可以使用execution(* 方法所属类.方法名(..))指示器选择方法。方法表达式以*开头,表示不关心返回值的类型。使用了全限定类名和方法名。方法参数列表用两个点号,表示切点要选择任意的该方法,不管参数是什么。在表达式中我们可以使用&&或者||或者!标识来表示切点需要匹配的具体情况。
12.spring还引入一个新的bean()指示器,允许我们在切点表达式中使用bean的id来标识bean。bean()使用bean的id或者名称作为参数来限制切点只匹配特定的bean。


13.切面
(1)使用@AspectJ注解定义切面,表示该类是一个POJO,而且还是一个切面。
(2)spring使用AspectJ注解来声明通知的方法有五种,分别是
a.@After
b.@Before
c.@AfterReturning
d.@AfterThrowing
e.@Around
(3)定义切点我们使用@Pointcut注解
(4)如果用JavaConfig形式来配置需要在类上添加注解@EnableAspectJAutoProxy
(5)如果使用XML的形式配置,我们需要使用<aop:aspectj-autoproxy>元素。
14.对于环绕通知,需要注意一下参数ProceedingJoinPoint对象,这个对象必须有,因为你要在通知同通过它来调用被通知的方法,通知方法中可以做任何事情,当要将控制权交给被通知的方法时,他需要调用其proceed()方法。


切点表达式中定义参数,传入到通知方法中

15.@DeclareParents注解
(1)value属性:指定哪种类型的bean要引入该接口。
(2)defaultImpl属性:指定了为引入功能提供实现的类。
(3)@DeclareParents注解所标注的静态属性指明了要引入接口。
16.使用XML来声明切面
Spring AOP配置元素能够以非侵入性的方式声明切面
<aop:advisor>:定义AOP通知器。
<aop:after>:定义AOP后置通知(不管被通知的方法是否执行成功)
<aop:after-returning>:定义返回通知
<aop:after-throwing>:定义异常通知
<aop:around>:定义AOP环绕通知
<aop:aspect>:定义一个切面
<aop:aspect-autoproxy>:启用@Aspect注解驱动的切面
<aop:before>:定义一个AOP前置通知。
<aop:config>:顶层的AOP配置元素。
<aop:declare-parents>:以透明的方式为被通知的对象引入额外的接口。
<aop:pointcut>:定义一个切点

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容