Spring AOP

Spring AOP

AOP指的是面向切面编程



一、代理机制

针对目标对象创建出一个代理对象,当执行目标对象上的某个方法时,我们可以在执行方法的前后添加上一些功能。

  1. 静态代理
    针对每个目标对象类都创建出一个代理类。
  2. 动态代理
    创建一个通用的代理类。
    使用到JDK中的InvocationHandler接口和Proxy.newProxyInstance()方法。
    只能针对实现了某个接口的类创建代理类。

二、AOP

面向切面编程。底层的原理就是代理机制。

在企业级应用开发中使用得最多的就是事务管理。

  1. 把应用程序中的服务性代码和业务代码分离(模块化),在需要时再动态的组装在一起。
    使开发人员只需要关注业务代码的实现,不需要考虑服务功能的问题。
  2. 术语
    • 切面(Aspect):就是指你要实现的服务功能。 如:日志记录、事务管理。 —>切面类
    • 连接点(Joinpoint):应用程序执行过程中可以插入切面的地点。如某方法调用时或者处理异
      常时。
    • 通知(Advice):在特定的连接点,AOP框架要执行的动作 。通知有各种类型
      其中包括“before”、“after”和“around”。如:向日志文件写日志、开启事务、提交事务。
    • 切入点(Pointcut):定义了需要注入advice的位置。通常使用一些表达式来定义。Aspectj表
      达式。
    • 目标对象(Target Object):被一个或者多个切面所通知的对象。
    • 代理对象(Proxy): 向目标对象应用通知之后被创建的对象。Spring框架会自动创建出这个代理对象。JavaSE中的代理,CGLIB代理。
    • 织入(Weaving):把切面应用到目标对象来创建新的代理对象的过程。Spring的切面是在程序
      运行的某个时刻被织入的。

三、Spring对AOP的支持

AOP配置步骤

  1. 先把服务功能代码所在类定义成一个受Spring管理的Bean
    <bean id="logBean" class="xxx.Xxx"/>
  2. 声明一个切面类
<aop:config>
<!-- 声明一个切面类 -->
<aop:aspect id="logAspect" ref="log">
</aop:aspect>
</aop:config>
<bean id="logBean" class="xxx.Xxx"/>
  1. 使用Aspectj表达式来定义切入点:
    <aop:pointcut id="allMethod" expression="execution(* com.qiujy.service..*.*(..))"/>
    Aspectj表达式

    常用形式:切入点指示符(返回值模式 包模式.类名模式.方法名模式(参数模式))
    a) 切入点指示符:execution - 匹配方法执行的连接点
    b) 返回值模式:* - 匹配任意的返回类型
    c) 包模式:指定你的业务类包名。如: com.csdnsoft.service
    d) 类名模式:、Service
    e) 方法名模式:、get、find*
    f) 参数模式:… -匹配了一个接受任意数量参数的方法

  2. 定义通知:

  3. 前置通知:<aop:before method="start" pointcut-ref="allMethod"/>

  4. 后置(方法正常执行后)通知: <aop:after-returning ../>

  5. 异常通知(抛出异常后):<aop:after-throwing ../>

  6. 最终通知(方法退出后执行): <aop:after ../>
    对应代码位置:

try{
before...
调用目标对象上的某个方法
after-returning...
}catch(Exception e){
after-throwing...
}finally{
after...
}
  1. 环绕通知:需要自己编写代码来指定。一般不用。
  2. 任何通知方法中都可以将第一个参数定义为 org.aspectj.lang.JoinPoint类型 。(环绕通知需要定
    义为ProceedingJoinPoint类型,是JoinPoint 的子类)
    JoinPoint接口提供了一系列有用的方法:

    getArgs() 返回方法参数
    getThis() 返回代理对象
    getTarget() 返回目标对象
    getSignature() 返回正在被通知的方法相关信息
    toString() 打印出正在被通知的方法的有用信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值