96SEO 2026-02-20 00:03 0
✅拓展知识仓✅静态代理和动态代理的区别✅动态代理的用途✅Spring

是一个第三方代码生成类库运行时在内存中动态生成一个了类对象从而实现对目标对象功能的扩展。
JDK的动态代理有一个限制就是使用动态代理的对象必须实现一个或多个接口。
如果想代理没有实现接口的类就可以使用CGLIB实现。
Cglib是一个强大的高性能的代码生成包它可以在运行期扩展Java类与实现Java接口。
它广泛的被许多AOP的框架使用例如Spring
Calib包的底层是通过使用一个小而快的字节码处理框架ASM来转换字节码并生成新的类。
不鼓励直接使用ASM因为它需要你对JVM内部结构包括class文件的格式和指令集都很熟悉。
所以使用JDK动态代理的对象必须实现一个或多个接口:而使用cgib代理的对象则无需实现接口达到代理类无侵入。
最大的区别就是静态代理是编译期确定的但是动态代理却是运行期确定的。
同时使用静态代理模式需要程序员手写很多代码这个过程是比较浪费时间和精力的。
一旦需要代理的类中方法比较多或者需要同时代理多个对象的时候这无疑会增加很大的复杂度。
Java的动态代理在日常开发中可能并不经常使用但是并不代表他不重要。
Java的动态代理的最主要的用途就是应用在各种框架中。
因为使用动态代理可以很方便的运行期生成代理类通过代理类可以做很多事情比如AOP比如过滤器、拦截器等。
的拦截器都使用了动态代理功能。
我们日常看到的mybatis分页插件以及日志拦截、事务拦截、权限拦截这些几乎全部由动态代理的身影。
AOP中的动态代理主要有两种方式JDK动态代理和CGLIB动态代理。
动态代理通过反射来接收被代理的类并且要求被代理的类必须实现一个接口。
JDK
Library)是一个代码生成的类库可以在运行时动态的生成某个类的子类注意CGLIB是通过继承的方式做的动态代理因此如果某个类被标记为final那么它是无法使用CGLIB做动态代理的。
stubSystem,out,println(--------------------add----------------------);}
{PerformanceMonior.begin(target.getClass().getlame(
)method.getlame());//System.out
.println(-----------------begin
“method.getName()---------);Object
args);//System.out.println(--------------end
)-----);PerformanceMonior.end();return
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(),this);}
UserServiceImpl();MyInvocationHandler
MyInvocationHandler(service);UserService
stubSystem.out,println(--------------------add----------------------);}}public
{//设置需要创建子类的类enhancer.setSuperclass(clazz);enhancer.setCallback(this);//通过字节码技术动态创建子类实例return
enhancer.create();}//实现MethodInterceptor接口方法public
{System.out.println(前置代理);//通过代理类调用父类中的方法Object
args);System.out.printIn(后置代理);return
CglibProxy();//通过生成子类的方式创建代理类UsenServiceImpl
(UsenServiceImpl)proxy.getProxy(UserServiceImpl.class);proxyImp.add():}
动态代理只对方法调用有效对字段访问和赋值无效。
如果目标对象抛出了异常那么这个异常会被代理对象抛出而不是在调用invoke方法时抛出。
CGLIB它是一个强大的高性能的代码生成库可以扩展JAVA类和实现JAVA接口。
它主要应用于高级OOP设计和应用如AOP实现、缓存框架、事务管理等。
两者的选择如果你的目标是基于现有类的行为进行拦截或修改可以使用CGLIB如果目标是基于接口进行拦截或修改那么应该使用JDK动态代理。
除了JDK动态代理和CGLIB还有其他一些常用的代理技术如Spring
AOP、AspectJ等。
这些技术提供了更高级的特性如支持方法级别的拦截、支持运行时和编译时切面等。
导入java.lang.reflect包中的InvocationHandler和Proxy类
java.lang.reflect.InvocationHandler;
定义一个实现InvocationHandler接口的类DynamicProxyHandler
实现InvocationHandler接口的方法invoke传入代理对象、方法、参数数组返回值类型为Object
创建一个HelloImpl类的实例作为目标对象并实现Hello接口的sayHello方法
创建一个DynamicProxyHandler类的实例作为InvocationHandler传入目标对象实例作为参数传入构造器中
使用Proxy类的静态方法newProxyInstance创建代理对象实例传入目标对象的类加载器、目标对象的接口数组以及*
InvocationHandler实例作为参数传入构造器中。
返回的是代理对象实例类型为目标对象的接口类型。
*
创建的代理对象实例可以直接像目标对象实例一样使用只不过它实现了所有接口中的方法。
*
所有这些方法的调用最终会调用到我们提供的InvocationHandler实例中对应的invoke方法中去处理。
*
这样我们就能够在不修改原有代码的基础上为某个对象提供额外行为操作*
也就是实现了在运行时动态扩展了某个类的行为功能操作即实现了AOP的功能。
*
这样就达到了在不修改原有代码的基础上扩展了某个类的行为功能操作的目的。
*
比如可以在目标对象方法执行前后添加额外的逻辑操作处理。
此处因为动态代理的目标是Hello接口所以没有错误。
*/
Proxy.newProxyInstance(HelloImpl.class.getClassLoader(),
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback