您的位置:首页 > 编程语言 > Java开发

Spring源码解析-AOP简单分析

2017-10-15 14:33 627 查看
  

  AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等,不需要去修改业务相关的代码。

对于这部分内容,同样采用一个简单的例子和源码来说明。

接口

public interface OrderService {

public void saveOrder();
}


实现类

public class OrderServiceImpl implements OrderService{
@Override
public void saveOrder() {
System.out.println("save order");
}
}


日志通知

public class LogAdvice implements MethodBeforeAdvice,AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("after logging");
}

@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("before logging");
}
}


测试类

@Test
public void testAop(){
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new OrderServiceImpl());
proxyFactory.addAdvice(new LogAdvice());

OrderService orderService = (OrderService) proxyFactory.getProxy();
orderService.saveOrder();
}


运行结果:

before logging
save order
after logging
源码分析:

先从MethodBeforeAdvice接口实现类AspectJMethodBeforeAdvice的before方法




上面的before是有拦截器MethodBeforeAdviceInterceptor调用




再看AfterReturningAdvice接口实现类AspectJAfterReturningAdvice的afterReturning方法




上面的afterReturning是有拦截器`AfterReturningAdviceInterceptor`调用



在这里可能大家会有些疑问`MethodBeforeAdviceInterceptor`和`MethodBeforeAdviceInterceptor`中都存在`mi.proceed()`代码,会不会执行2次呢?
答案是不会,进行调式发现只有`AfterReturningAdviceInterceptor`中的proceed方法执行了saveOrder()方法,其实我们也可以通过Spring的命名来猜测,
`MethodBeforeAdviceInterceptor`方法执行前,所以不会执行目标方法。下面具体调试的过程。


before



after





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: