Spring in Action(第四章 面向切面编程)学习笔记

1.在软件开发中,分布于应用中多处的功能被称为横切关注点。这些横切关注点从概念上是与应用的
业务逻辑相分离的,将这些横切关注点与业务逻辑相分离正式面向切面编程(AOP)所解决的。依赖注入
有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。

2.继承和委托是最常见的实现通过功能的面向对象技术,但是如果在整个应用中使用相同的基类,继承
往往导致一个脆弱的对象体系;二使用委托可能需要对委托对象进行复杂的调用,切面提供了取代继承
和委托的另一种的选择,而且在很多场景下更清晰简洁。横切关注点可以被模块快为特殊的类,这个类
被称为切面。这样做有两个好处,首先是每个关注点现在集中于一处,而不是分散到多处代码中;服务
模块更简洁,因为它只包含主要关注点(核心功能)的代码,次要专注点的代码被转移到切面中了。

3.描述切面的常用术语有:通知(advice), 切点(pointcut),连接(join point)
通知:切面要完成的工作叫通知,如记录用电量是抄表员的主要任务,和通知类似
切点:

4.通知(Advice),在AOP术语中,切面的工作被称为通知。Spring切面可以应用5种类型的通知。
Before:在方法被调用之前通知;
After:之后通知,无论是否执行成功;
After-returning:在方法执行成功后调用通知;
After-throwing:在方法抛出异常后通知;
Around:通知包裹了被通知的方法,在被通知方法调用之前和之后执行自定义行为。

5.连接点,连接点是程序执行过程中能够应用通知的所有点就是连接点,我们的应用执行过程中需要对
数以千计的时机应用通知,这些时机叫做连接点;连接点是应用执行过程中能够插入切面的一个点,这
个点可以为调用方法时、抛出异常时、甚至修改一个字段时。

6.切点,切点用于准确定位该在什么地方应用切面的通知,如果通知定义了切面的什么和何时,那么
切点就定义了何处,切点的定义会匹配通知所要织入的一个或多个连接点,我们通常使用明确的类来和
方法的名称来指定这些切点。

7.切面,切面是通知和切点的结合,通知和切点共同定义了关于切面的全部内容,它是什么,在何时和
何处完成其功能。

8.引入,引入允许我们向现有的类添加新方法或属性

9.织入(wearing),织入是将切面应用到目标对象来创建新的代理对象的过程,切面在指定的连接点被
织入到目标对象中去,在目标对象的生命周期里有多个点可以进行织入。
织入的时机可在编译期、类加载期和运行期。

10.Spring提供了4种各具特色的AOP支持:
基于代理的经典AOP;
@AspectJ注解驱动的切面;
纯POJO切面;
注入式AspectJ切面

11.编写切点
execution()用于匹配是连接点的执行方法,within()限制连接点匹配指定注解所标注的类型(当使用Spring
 AOP时,方法定义在由指定的注解所标注的类中)
方法表达式以*开始,标识了我们不关心方法返回值的类型,然后,我们指定了全限定类名和方法名。对于
方法参数列表,我们使用(….)标识切点选择任意的play()方法,无论该方法的入参是什么。
1execution(2*3com.springinaction.com.springidol.Instrument.4play(5..))6&&7within(7com.springnaction.springidol.*)
1在方法执行时触发
2 返回任意类型
3方法所属的类型
4此方法
5使用任何参数
6与and操作符
7当com.springnaction.springidol包下任意类的方法被调用时

12.使用Spring的bean()指示器
execution(*com.springinaction.com.springidol.Instrument.play(..))and bean(eddie)执行Instrument的play()
方法时应用通知,但限定Bean的ID为eddie
execution(*com.springinaction.com.springidol.Instrument.play(..))and !bean(eddie)执行Instrument的play()
方法时应用通知,但限定Bean的ID为非eddie

13.在xml中声明切面
重点

14.注解切面

定义切面
@Aspect
public class Audience{
@Pointcut("execution(*com.springinaction.com.springidol.Instrument.play(..)")
public void performance(){
}

@Before(“performance”)
public void takeSeats(String ){

}
}
15.传递参数给所标注的通知

16.AOP是面向对象编程的一个强大补充,通过AspectJ,我们现在可以将之前分散在应用各处的行为放入可
重用的模块中。我们显式地声明在何处如何应用该行为,这有效减少了代码冗余,并让我们的类关注自身的
主要功能。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值