Spring基础之IOC与AOP(3)

17 篇文章 0 订阅

啥是AOP(面向切面)

面向切面也就是实现代码业务逻辑的解耦,所谓解耦。就是两个模块之间的业务逻辑是无关联的,分开的。

面向切面编程也是一种模块化机制:核心思想是从关注点中分离出横切关注点。(这样关注的问题从代码的业务逻辑独立出来,解耦)。

面向切面关注以下几点:

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体形象特征的抽象,切面就是对切入点的一个引申,抽象出来的定义。坦白来讲就是对代码重复的模块抽取出来,在运行的时候往业务方法中动态植入"切面类代码"。(当然这是其中的一个方面。)

3、连接点(joinpoint)

Spring中连接点指的是被拦截的方法或者字段或者构造器。

4、切入点(pointcut)

切入点在AOP(面向切面)中的通知和切入点表达式关联,制定拦截哪些类的那些方法,给指定的类在运行的时候动态的植入切面类代码。

5、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,

Spring切面可以应用5种类型的通知:

前置通知(Before):在目标方法被调用之前调用通知功能;

后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

返回通知(After-returning):在目标方法成功执行之后调用通知;

异常通知(After-throwing):在目标方法抛出异常后调用通知;

环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

注:可以将多个通知应用到一个目标对象上,即可以将多个切面织入到同一目标对象。

6、目标对象

被一个或者多个切面所通知的对象。

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

9、AOP代理(AOP Proxy)

在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。

 

使用 Spring AOP 可以基于两种方式,一种是比较方便和强大的注解方式,另一种则是中规中矩的 xml

配置方式。

代理模式下一期说:

讲下常用的:

掌握和使用切入点表达式。

切入点表达式的配置规则。

通常情况下,表达式中使用”execution“就可以满足大部分的要求。

表达式格式如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?

 

modifiers-pattern:方法的操作权限

ret-type-pattern:返回值

declaring-type-pattern:方法所在的包

name-pattern:方法名

parm-pattern:参数名

throws-pattern:异常

其中,除 ret-type-pattern 和 name-pattern 之外,其他都是可选的。

上例中,execution(* com.spring.service.*.*(..))表示 com.spring.service 包下,返回值为任意类型;方法名任意; 参数不作限制的所有方法。

 

最后说一下通知参数 可以通过 args 来绑定参数,这样就可以在通知(Advice)中访问具体参数了。

例如, 配置如下: 上面的代码 args(msg,..)是指将切入点方法上的第一个 String 类型参数添加到参数名为 msg 的通知 的入参上,这样就可以直接使用该参数啦。

访问当前的连接点 在上面的 Aspect 切面 Bean 中已经看到了,每个通知方法第一个参数都是 JoinPoint。其实,在 Spring 中,任何通知(Advice)方法都可以将第一个参数定义为 org.aspectj.lang.JoinPoint 类型用以 接受当前连接点对象。JoinPoint 接口提供了一系列有用的方法, 比如 getArgs() (返回方法参数)、 getThis() (返回代理对象)、getTarget() (返回目标)、getSignature() (返回正在被通知的 方法相关信息)和 toString() (打印出正在被通知的方法的有用信息)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值