springAOP——代理对象的产生及方法调用
来源:互联网 发布:支付宝付款需要网络吗 编辑:程序博客网 时间:2024/06/04 23:22
代理对象的创建
getObject--》
void org.springframework.aop.framework.ProxyFactoryBean.initializeAdvisorChain() throws AopConfigException, BeansException
初始化拦截器链路--》
addAdvisorOnChainCreation(advice, name);找到advisor并添加--》
this.advisors.add(pos, advisor);设置advisors集合。--》
然后创建代理对象,可以用JDK动态代理或者CGLIB字节码加强。
ProxyFactoryBean继承了AdvisedSupport,在创建AopProxy(例如org.springframework.aop.framework.JdkDynamicAopProxy)实例的时候会把自己传递过去,也就是AopProxy持有一个AdvisedSupport,也就只有了advisors——》简单来说,aop代理对象知道自己上有哪些拦截器(通知器),在invoke的时候来解析。--》
invoke 以JDK动态代理为例
Object org.springframework.aop.framework.JdkDynamicAopProxy.invoke(Object proxy, Method method, Object[] args)
//目标对象
target = targetSource.getTarget();
// Get the interception chain for this method.
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
获取拦截器链路
然后构造一个MethodInvocation——invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);递归调用
拦截器链路的获取:List<Object> org.springframework.aop.framework.AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice(Method method, Class targetClass)回归到了AdvisedSupport
cached = this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(
this, method, targetClass);--》
List<Object> org.springframework.aop.framework.DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, Class targetClass)
boolean hasIntroductions = hasMatchingIntroductions(config, targetClass);//检查是否有IntroductionAdvisor配置
for (Advisor advisor : config.getAdvisors()) {开始处理config其实就是我们前面提到的那个AdvisedSupport,它代表了配置,持有所有通知器
。。。
MethodInterceptor[] interceptors = registry.getInterceptors(advisor);//Advisor中提取MethodInterceptor,这个很重要,不管是通知还是拦截器统统转换为MethodInterceptor
--》
MethodInterceptor[] org.springframework.aop.framework.adapter.DefaultAdvisorAdapterRegistry.getInterceptors(Advisor advisor) throws UnknownAdviceTypeException
这是一个适配器,可以处理本来就是MethodInterceptor的,也可以处理各种Advice(如MethodBeforeAdvice):
//如果是MethodInterceptor
if (advice instanceof MethodInterceptor) {
interceptors.add((MethodInterceptor) advice);
}
//如果是其他通知器
for (AdvisorAdapter adapter : this.adapters) {//各种适配器将Advice转换为MethodInterceptor
if (adapter.supportsAdvice(advice)) {
interceptors.add(adapter.getInterceptor(advisor));
}
}
adapter有三种:MethodBeforeAdviceAdapter、AfterReturningAdviceAdapter、ThrowsAdviceAdapter他们都实现了这样的接口adapter.getInterceptor(advisor),如
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
//将MethodBeforeAdvice提取出来转换成MethodBeforeAdviceInterceptor(实现了MethodInterceptor接口),那么在构造MethodInvocation一次调用各拦截器invoke方法的时候,就变成了前置、后置、环绕处理。
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
- springAOP——代理对象的产生及方法调用
- 【SpringAOP】——JDK动态代理
- 对象的方法及调用
- Java动态代理-创建动态类的实例对象及调用其方法
- 查看Proxy产生的代理对象
- 【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法
- SpringAOP嵌套调用的解决办法
- SpringAOP嵌套调用的解决办法
- SpringAOP嵌套调用的解决办法
- SpringAOP嵌套调用的解决办法
- springAOP的配置及实例
- SpringAOP拦截器的代理机制
- JavaScript - 对象实例化、调用对象的属性及方法
- Objective-C学习笔记(十八)——对象方法和类方法的声明,定义及调用
- java 代理模式,JDK动态代理,SpringAOP的实现
- Number调用toString()方法产生的问题
- SpringAOP功能自我调用的解决方案
- 对象的调用方法
- ubuntu安装deb,rpm安装包方法
- 说话就是生产力
- 最短路之bellman-ford
- 0-1背包问题与完全背包问题C++实现 动态规划
- 元旦随想
- springAOP——代理对象的产生及方法调用
- android:layout_width="match_parent"
- Yii 的登录流程
- Yii框架执行流程
- 关于HTML5的11个让人难以接受的事实
- JAVA基础之理解JNI原理
- 在宿舍的最后一晚上
- 一些iOS高效开源类库
- Android 使用Wake Lock