Spring——AOP实现原理(基于JDK和CGLIB)
Posted 杨晨光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——AOP实现原理(基于JDK和CGLIB)相关的知识,希望对你有一定的参考价值。
本文转自:http://blog.csdn.net/luanlouis/article/details/51155821
0、前言
在上篇文章 《Spring设计思想》AOP设计基本原理 中阐述了Spring AOP 的基本原理以及基本机制,本文将深入源码,详细阐述整个Spring AOP实现的整个过程。
1、Spring内部创建代理对象的过程
在Spring的底层,如果我们配置了代理模式,Spring会为每一个Bean创建一个对应的ProxyFactoryBean的FactoryBean来创建某个对象的代理对象。
假定我们现在有一个接口TicketService及其实现类RailwayStation,我们打算创建一个代理类,在执行TicketService的方法时的各个阶段,插入对应的业务代码。
[java] view plain copy print ?
- package org.luanlouis.meditations.thinkinginspring.aop;
- /**
- * 售票服务
- * Created by louis on 2016/4/14.
- */
- public interface TicketService
- //售票
- public void sellTicket();
- //问询
- public void inquire();
- //退票
- public void withdraw();
[java] view plain copy print ?
- package org.luanlouis.meditations.thinkinginspring.aop;
- /**
- * RailwayStation 实现 TicketService
- * Created by louis on 2016/4/14.
- */
- public class RailwayStation implements TicketService
- public void sellTicket()
- System.out.println("售票............");
- public void inquire()
- System.out.println("问询.............");
- public void withdraw()
- System.out.println("退票.............");
[java] view plain copy print ?
- package org.luanlouis.meditations.thinkinginspring.aop;
- import org.springframework.aop.MethodBeforeAdvice;
- import java.lang.reflect.Method;
- /**
- * 执行RealSubject对象的方法之前的处理意见
- * Created by louis on 2016/4/14.
- */
- public class TicketServiceBeforeAdvice implements MethodBeforeAdvice
- public void before(Method method, Object[] args, Object target) throws Throwable
- System.out.println("BEFORE_ADVICE: 欢迎光临代售点....");
[java] view plain copy print ?
- package org.luanlouis.meditations.thinkinginspring.aop;
- import org.springframework.aop.AfterReturningAdvice;
- import java.lang.reflect.Method;
- /**
- * 返回结果时后的处理意见
- * Created by louis on 2016/4/14.
- */
- public class TicketServiceAfterReturningAdvice implements AfterReturningAdvice
- @Override
- public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable
- System.out.println("AFTER_RETURNING:本次服务已结束....");
[java] view plain copy print ?
- package org.luanlouis.meditations.thinkinginspring.aop;
- import org.springframework.aop.ThrowsAdvice;
- import java.lang.reflect.Method;
- /**
- * 抛出异常时的处理意见
- * Created by louis on 2016/4/14.
- */
- public class TicketServiceThrowsAdvice implements ThrowsAdvice
- public void afterThrowing(Exception ex)
- System.out.println("AFTER_THROWING....");
- Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口