Spring进修笔记(二)--AOP
添加时间:2013-5-7 点击量:
一.概论
从图上可以看出,Spring AOP的所有概念基本分为三块:
第一块(左上角)为AOP设备,首要包含ProxyConfig,AdvisedSupport,这些设备包含AOP首要概念如target(目标对象),Advisors(切入点及其对应的加强)构成的处理惩罚链。
第二块为(右上角)AOPProxyFactory这主如果沿用了spring的首要思惟即机关首要都采取factoryBean封装,可以生成不合的AopProxy,如Cglib2AopProxy,JdkDynamicProxy.
第三块(下方)为逻辑,包含Spring的InvocationHandler实现JdkDynamicProxy(首要实现调用阻碍加强过程),Proxy(可按照InvocationHandler,目标对象实现接口生成类¥Proxy0,¥Proxy0为生成的类。
二、JDKDynamicProxy生成类¥Proxy0解析:
1. 类构成项目组:
- 机关函数¥Proxy0(InvocationHandler h)。
- 成员变量InvocationHandler h
- static Method m1,m2,m3,…,mn等储存所有target实现接口的Method类型的字段。
- 办法 所有target实现接口内声明的办法。
2. 实现道理:
在static办法块中会将所有的接口中的所有办法全部给获得,并储存在m1,m2,m3,...,mn字段中,并且会生成接口中所有的办法.办法的实现为调用其作为成员变量的InvocationHander的invoke(Object proxy,Method method,Object[]args)办法,将参数和办法字段mn传入,进行调用。而一般来说target目标对象会调用响应的method,在这个调用过程中就会应用Advisor的义务链来进行多余特点的植入。
三、调用加强过程:
以JDKDynamicProxy为例:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
1. 从advised中获得targetSource。
2. 从advised中获得所有的Chain
org.springframework.aop.framework.DefaultAdvisorChainFactory
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
Advised config, Method method, Class targetClass)
hasIntroductions 没有
轮回接见config中所有的Adivisors
若是Advisor是PointcutAdvisor
看这个Advisor是否满足ClassFilter
将Advisor转换成MethodInterceptor
是则匹配办法从Pointcut中取MethodMatcher,应用MethodMatcher来匹配办法
3. 若是chain是空的,retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args);
// We need to create a method invocation...
invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
// Proceed to the joinpoint through the interceptor chain.
retVal = invocation.proceed();
读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
一.概论
从图上可以看出,Spring AOP的所有概念基本分为三块:
第一块(左上角)为AOP设备,首要包含ProxyConfig,AdvisedSupport,这些设备包含AOP首要概念如target(目标对象),Advisors(切入点及其对应的加强)构成的处理惩罚链。
第二块为(右上角)AOPProxyFactory这主如果沿用了spring的首要思惟即机关首要都采取factoryBean封装,可以生成不合的AopProxy,如Cglib2AopProxy,JdkDynamicProxy.
第三块(下方)为逻辑,包含Spring的InvocationHandler实现JdkDynamicProxy(首要实现调用阻碍加强过程),Proxy(可按照InvocationHandler,目标对象实现接口生成类¥Proxy0,¥Proxy0为生成的类。
二、JDKDynamicProxy生成类¥Proxy0解析:
1. 类构成项目组:
- 机关函数¥Proxy0(InvocationHandler h)。
- 成员变量InvocationHandler h
- static Method m1,m2,m3,…,mn等储存所有target实现接口的Method类型的字段。
- 办法 所有target实现接口内声明的办法。
2. 实现道理:
在static办法块中会将所有的接口中的所有办法全部给获得,并储存在m1,m2,m3,...,mn字段中,并且会生成接口中所有的办法.办法的实现为调用其作为成员变量的InvocationHander的invoke(Object proxy,Method method,Object[]args)办法,将参数和办法字段mn传入,进行调用。而一般来说target目标对象会调用响应的method,在这个调用过程中就会应用Advisor的义务链来进行多余特点的植入。
三、调用加强过程:
以JDKDynamicProxy为例:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
1. 从advised中获得targetSource。
2. 从advised中获得所有的Chain
org.springframework.aop.framework.DefaultAdvisorChainFactory
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
Advised config, Method method, Class targetClass)
hasIntroductions 没有
轮回接见config中所有的Adivisors
若是Advisor是PointcutAdvisor
看这个Advisor是否满足ClassFilter
将Advisor转换成MethodInterceptor
是则匹配办法从Pointcut中取MethodMatcher,应用MethodMatcher来匹配办法
3. 若是chain是空的,retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args);
// We need to create a method invocation...
invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
// Proceed to the joinpoint through the interceptor chain.
retVal = invocation.proceed();
读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。