Spring 动态代理(四)- 动态代理核心类
来源:互联网 发布:淘宝助手 mac版下载 编辑:程序博客网 时间:2024/06/05 23:07
动态代理主要的相关类
ProxyCreatorSupport
ProxyCreatorSupport是spring动态代理比较重要的类,该类的继承层次如下:
动态代理核心步骤
1. ProxyCreatorSupport
无论使用什么动态代理主要都是设置如下三种信息,而spring的类ProxyCreatorSupport(父类:AdvicedSupport)就是用于设置并保存这些信息的。
- 设置被代理对象target
- 设置代理接口
- 设置通知advice
2. Advice
通知也是一种bean,要代理其他对象,首先要获取通知(Advice)bean,然后将Advice 包装成Advisor(DefaultPointcutAdvisor)。这个步骤主要是由DefaultAdvisorAdapterRegistry来做,DefaultAdvisorAdapterRegistry会判断Advice是否合法,然后包装成Advisor,支持的通知类型如下:
* Advisor
* MethodInterceptor
* MethodBeforeAdvice
* AfterReturningAdvice
* ThrowsAdvice
@Override public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException { if (adviceObject instanceof Advisor) { return (Advisor) adviceObject; } if (!(adviceObject instanceof Advice)) { throw new UnknownAdviceTypeException(adviceObject); } Advice advice = (Advice) adviceObject; if (advice instanceof MethodInterceptor) { // So well-known it doesn't even need an adapter. return new DefaultPointcutAdvisor(advice); } for (AdvisorAdapter adapter : this.adapters) { // Check that it is supported. if (adapter.supportsAdvice(advice)) { return new DefaultPointcutAdvisor(advice); } } throw new UnknownAdviceTypeException(advice); }
后三者MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice的判断是通过在DefaultAdvisorAdapterRegistry注册三种AdviceAdapter实现的。
public DefaultAdvisorAdapterRegistry() { registerAdvisorAdapter(new MethodBeforeAdviceAdapter()); registerAdvisorAdapter(new AfterReturningAdviceAdapter()); registerAdvisorAdapter(new ThrowsAdviceAdapter()); }
3. List advisors
获取通知后,会存储到AdvisedSupport的List集合中,AdvisedSupport中有一个List和一个数组来保存Advisor,数组的存在就是为了内部操作方便。
/** * List of Advisors. If an Advice is added, it will be wrapped * in an Advisor before being added to this List. */ private List<Advisor> advisors = new LinkedList<Advisor>(); /** * Array updated on changes to the advisors list, which is easier * to manipulate internally. */ private Advisor[] advisorArray = new Advisor[0];
4. 创建代理createAopProxy()
无论是ProxyFactoryBean 还是ProxyFactory创建代理都是调用其父类ProxyCreatorSupport的createAopProxy()方法。
5. AopProxyFactory
ProxyCreatorSupport创建代理是通过内部的代理工厂DefaultAopProxyFactory来实现的。
6. AopProxy
DefaultAopProxyFactory会根据代理ProxyCreatorSupport的配置来决定是采用jdk还是cglib动态代理,无论是那种代理,都返回AopProxy,然后在ProxyCreatorSupport调用代理(AopProxy)的getProxy方法获取代理对象。
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } }
7. JDK、CGLIB
jdk:
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
cglib:
Enhancer enhancer = new Enhancer(); //设置代理类enhancer.setSuperclass(clazz);//设置回调拦截enhancer.setCallback(this);return enhancer.create();
Spring 动态代理(一) - 代理模式
Spring 动态代理(二) - ProxyFactoryBean
Spring 动态代理(三) - BeanNameAutoProxyCreator
Spring 动态代理(四)- 动态代理核心类 - ProxyCreatorSupport
Spring 动态代理(五) - 自定义BeanTypeAutoProxyCreator
- Spring 动态代理(四)- 动态代理核心类
- jdk动态代理,spring核心动态代理
- (九)Spring核心框架 - AOP之动态代理机制
- 【spring】静态代理&&动态代理
- spring静态代理 动态代理
- spring静态代理 动态代理
- spring静态代理 动态代理
- spring静态代理 动态代理
- Spring动态代理(一)
- Spring 动态代理(一)
- Spring 动态代理(二)
- Spring 动态代理(三)
- Spring 动态代理(五)
- Spring的代理模式(静态代理和动态代理)
- Spring的代理模式(静态代理和动态代理)
- Spring 代理中的静态代理、动态代理
- Spring 关于动态代理
- Spring中的动态代理
- Ubantu16.04下创建matlab启动快捷键
- 通俗的方式理解RxJS
- Spark2.x学习笔记:9、 Spark编程实例
- pandas read data from files
- CentOS 6.5 yum安装MongoDb
- Spring 动态代理(四)- 动态代理核心类
- 51 nod 1087 1 10 100 1000 (set)
- 编写程序数一下 1到 100 的所有整数中出现多少次数字9
- 动态规划——序列对准
- mybatis中的#和$的区别?
- with as 固化的结果集是否可以使用原表的索引?
- 关于GPIO的设置
- c++------------之---【虚析构函数应用】
- BufferedInputStream和BufferOutputStream的用法。