springAOP——代理对象的产生及方法调用
2012-01-03 00:54
411 查看
代理对象的创建
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);
}
}
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);
}
}
相关文章推荐
- Spring AOP不拦截从对象内部调用的方法原因
- Spring aop事务代理对象通过TransactionInterceptor处理目标方法事务过程,cglib方式
- Spring AOP不拦截从对象内部调用的方法原因
- SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.
- Spring AOP不拦截从对象内部调用的方法原因
- spring AOP中自身方法调用无法应用代理解决办法
- 【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法
- Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题
- Spring AOP不拦截从对象内部调用的方法原因
- Spring 代理对象,cglib,jdk的问题思考,AOP 配置注解拦截 的一些问题.为什么不要注解在接口,以及抽象方法.
- Spring源码分析----建立AopProxy代理对象和AOP拦截器的调用
- Spring AOP不拦截从对象内部调用的方法原因
- Spring AOP不拦截从对象内部调用的方法原因
- 【知识库】--spring aop 动态代理--inner private protected 方法失效(212)
- spring aop获取目标对象的方法对象(包括方法上的注解)
- Spring AOP为什么不能拦截同一个对象内方法的嵌套调用
- Spring进阶之路(10)-Advice简介以及通过cglib生成AOP代理对象
- Spring AOP:被代理类的构造函数和调用自身类方法的注意点
- Spring Aop(十三)——ProxyFactoryBean创建代理对象
- spring经典的基于代理的AOP编程-方法