博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring---aop(8)---Spring AOP中optimize
阅读量:4972 次
发布时间:2019-06-12

本文共 1973 字,大约阅读时间需要 6 分钟。

写在前面

  optimize是ProxyConfig的属性。意思为 是否对生产代理策略使用优化。

public class ProxyConfig implements Serializable {    private boolean proxyTargetClass = false;    private boolean optimize = false;    boolean opaque = false;    boolean exposeProxy = false;    private boolean frozen = false;}

 

一个例子

  Spring AOP 提供一个可根据Bean名称来自动生产代理的工具,它就是BeanNameAutoProxyCreator。它的配置是这样:

 

  以上使用BeanNameAutoProxyCreator 只为后缀为"impl"的Bean生产代理。需要注意的是,这个地方我们不能定义代理接口,也就是interfaces属性,因为我们根本就不知道这些Bean到低实现了多少接口。此时不能代理接口,而只能代理类。所以这里提供了一个新的配置项,它就是optimize。如果为true,则可以对代理生成策略进行优化(默认为false)。也就是说,如果该类有接口,就代理接口(使用JDK代理);如果没有接口,就代理类(使用CGLIB代理)。并非像之前的使用的proxyTargetClass 属性那样,强制代理类,而不去考虑代理接口的方式。

 

  那么就有一个问题了,既然有了CGLIB 可以代理任何类了,那为什么还要JDK的动态代理了?

  是因为CGLIB 创建有个特点(创建慢,执行块),然而JDK刚好相反(创建快,执行慢)。如果在运行的时候不断的用CGLIB去创建代理,系统的性能会大打折扣,所以建议一般在系统初始化的使用用CGLIB去创建代理,并放入spring的ApplicationContext中以备后用。

 

流程分析

@Override    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); } }

 

ProxyTargetClass (是否强制使用CGLIB来实现代理)

         (true : 强制使用CGLIB来实现代理)

         (false : 不强制使用CGLIB来实现代理,首选JDK来实现代理)(默认值)

isOptimize (是否对生成代理策略进行优化)

         (true :  进行优化,如果有接口就代理接口(使用JDK动态代理),没有接口代理类(CGLIB代理))

         (false : 不进行优化) (默认值)

 

 

转载于:https://www.cnblogs.com/chihirotan/p/7363761.html

你可能感兴趣的文章
【WEB】高并发Web服务的演变-节约系统内存和CPU
查看>>
逻辑漏洞挖掘方式
查看>>
Servlet 编写过滤器
查看>>
Redis 数据类型
查看>>
Console-算法-回文数
查看>>
C#常用格式输出
查看>>
创建数据库表的SQL语句
查看>>
在Visual Studio 2010[VC++]中使用ffmpeg类库
查看>>
redis(四)--简单实现Redis缓存中的排序功能
查看>>
盒子模型
查看>>
使用 ingress-nginx 暴露服务
查看>>
android:设置布局参数LayoutParams
查看>>
Ant 打包 问题
查看>>
教程-Delphi7 自带控件安装对应表
查看>>
HTML5规范-相关资料链接(大多都是英文文档)
查看>>
前台声明变量
查看>>
羽翼特效设计
查看>>
pycharm快捷键
查看>>
转载:Windows的进程创建和映像装入
查看>>
线段树(已修改+补题
查看>>