Spring AOP 面向切面编程 常见通知实现(前置,后置,环绕,异常)

AOP(Aspect-Oriented Programming)

1.面向切面编程

2.对传统的oop的补充

3.不是取代oop,经常和oop一起使用

切面:需要实现的交叉功能

连接点:应用程序执行过程中插入切面的地点:此处可是方法调用、异常抛出甚至是要修改的字段

通知:通知切面的实际实现。他通知应用系统新的行为,通知在连接点插入到应用系统中

切入点:定义了通知应该应用在那些连接点。通常通过指定类名和方法名,或匹配类名和方法名式样的正则表达式来指定切入点。

引入:允许为已存在类添加新方法和属性

目标对象:被通知对象。即可使编写的类也可是添加定制行为的第三方类。

代理将通过应用到目标对象后创建的对象。

织入:将通知应用到目标对象从而创建一个新的代理对象的过程。切面在指定接入点被织入到目标对象中,之如发生在目标对象生命周期的多个点上:

编辑器:切面在目标对象编译时织入(需特殊的编译器)

类装载器:切面在目标对象被载入到JVM时织入(需特殊的类加载器,在类的载入到应用系统之前增强目标对象的字节码)

运行期:切面在应用系统运行时织入(通常,AOP容器将在织入切面时动态生成委托目标对象的代理对象)

前置通知 接口MethodBeforeAdvice

package com.users.advices

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
import com.users.util.Md5Encode;

public class Md5Advice implements MethodBeforeAdvice{
 @Override
 public void before(Method arg0, Object[] arg1, Object arg2)
   throws Throwable {
  System.out.println(arg0.getName());
  System.out.println(arg1[1]);
  System.out.println(arg2.getClass().getName());
  
  String newPass=Md5Encode.getMD5(arg1[1].toString().getBytes());
  arg1[1]=newPass;
 }
}

Bean.xml配置

 <bean id="Md5Advice" class="com.users.advices.Md5Advice"></bean>
 <bean id="ScoreAdvice" class="com.users.advices.ScoreAdvice"></bean>
 <bean id="TimeAdvice" class="com.users.advices.TimeAdvice"></bean>
 <bean id="UsersBizImpl" class="com.users.biz.UsersBizImpl"></bean>
 
 <bean id="UsersBizProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="proxyInterfaces">
   <value>com.users.biz.UsersBiz</value>
  </property>
  <property name="interceptorNames">
   <list>

     <!--此处用来加通知-->

     <value>Md5Avice</value>
   </list>
  </property>
  <property name="target" ref="UsersBizImpl"></property>
 </bean>

 

后置通知 接口AfterReturningAdvice

package com.users.advices;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;

public class ScoreAdvice implements AfterReturningAdvice{
 @Override
 public void afterReturning(Object returnValue, Method method,
   Object[] args, Object target) throws Throwable {
  System.out.println(returnValue);
  System.out.println(target);
  System.out.println("增加20个积分");
 }
}

环绕通知 接口MethodInterceptor

package com.users.advices;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class TimeAdvice implements MethodInterceptor{
 @Override
 public Object invoke(MethodInvocation invocation) throws Throwable {
  System.out.println("前:"+System.currentTimeMillis());
  Object obj = invocation.proceed();//此句执行业务逻辑方法
  System.out.println("后:"+System.currentTimeMillis());
  return obj;//返回值 可不返回obj(业务逻辑的返回值)
 }
}

环绕通知与前两种通知的区别:

1.该通知能够控制目标方法是否被调用。通过invocation.proceed()方法来调用。

2.该通知可以控制返回值。可以返回一个与proceed()方法返回对象完全不同的对象。

异常通知 接口ThrowsAdvice

public Error implements ThrowsAdvice{

}

该接口没有任何方法,但实现该接口的类必须要有如下形式的方法:

void afterThrowing(Throwable throwable);

void afterThrowing(Method m,Object[] os,Objecttarget,Throwablethrowable);

第一个方法只接受一个参数:需要抛出的异常。

第二个方法接受异常、被调用的方法、参数以及目标对象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值