96SEO 2026-02-20 09:20 10
动态代理#xff1a;分为编译时增强(AspectJ)和运行时增强(JDK动态代理和CGLIB动态代理)

动态代理分为编译时增强(AspectJ)和运行时增强(JDK动态代理和CGLIB动态代理)
这种代理在我们日常生活中其实非常常见例如房屋中介就相当于是一个代理当房东需要出租房子的时候需要发布广告、寻找客户、清理房间。
。
。
由于比较麻烦因此房东可以将租房子这件事情委托给中间代理去做。
这就是一个静态代理。
我通过一个简单的代码来演示一下首先我们有一个租房的接口如下:
{published();loadlord.rent();agentFee();}private
published(){System.out.println(发布广告);}private
agentFee(){System.out.println(收取中介费);}
Loadlord());houseAgent.rent();//输出发布广告//
动态代理讲究在不改变原类原方法的情况下增强目标方法的功能例如大家平时使用的Spring
事务功能在不改变目标方法的情况下就可以通过动态代理为方法添加事务处理能力。
日志处理、接口幂等性处理、多数据源处理等都是动态代理能力的体现。
transferMoney(){System.out.println(执行转账操作);}
}如果通过动态代理来为上面的业务代码添加事务那么我们只需要做一些配置系统会自动生成动态代理的类和方法:
e){//回滚事务}}}上面这个是自动生成的代理类不需要开发者开发。
Lombok的感觉就是在编译阶段就直接生成了代理类将来运行的时候就直接运行这个编译生成的代理类AspectJ就是这样一种编译时增强的工具。
AspectJ其官网地址是:http://www.eclipse.or
截止到本文写作时目前最新版本为:1.9.7。
从官网我们可以看到AspectJ的定位:
首先在idea里面运行AspectJ需要先安装AspectJ插件如下
安装好之后我们需要在idea中配置一下使用ajc编译器代替javac
步所需要的jar也可以在项目的Maven中添加如下依赖自动下载,下载到本地仓库之后再删除掉
dependencygroupIdorg.aspectj/groupId
artifactIdaspectjtools/artifactIdversion1.9.7.M3/version
transferMoney(){System.out.println(转账操作);}
MoneyService.transferMoney()){System.out.println(开启事务);try{proceed();System.out.println(提交事务事务);}
e){System,out.println(回滚事务);}}}这就是
AspectJ的语法跟Java有点像但是不太一样。
需要注意的是这个
MoneyService();moneyService.transferMoney();}}运行结果如下
AspectJ的作用就有点类似于Lombok直接在编译时期将我们的代码改了这就是编译时增强。
这个代理有一个要求就是被代理的对象必须要有一个接口没有接口不行。
但是CGLIB没有这个要求。
{System.out.println(ab最终输出:(ab));return
System.out.println(method.getName()
CalculatorImpl();//第二个参数表示生成的代理对象要实现哪些接口ICalculator
Proxy.newProxyInstance(Demo2.class.getClassLoader(),
System.currentTimeMillis();Object
System.currentTimeMillis();System.out.println(method.getName()
invoke;}});System.out.println(calculator.getClass()
calculator.getClass());calculator.add(3,
1.Proxy.newProxyInstance方法表示要生成一个动态代理对象。
2.newProxylnstance方法有三个参数第一个是一个类加载器第二个参数是一个被代理的对象所实现的接口第三个则是具体的代理逻辑。
方法该方法有三个参数分别表示当前代理对象被拦截下来的方法以及方法的参数我们在该方法中可以统计被拦截方法的执行时间通过方式执行被拦截下来的目标方法。
4.最终第一步的方法返回了一个代理对象执行该代理对象就有代理的效果了。
上面这个案例就是一个JDK动态代理。
这是一种运行时增强在编译阶段并未修改我们的代码。
dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version
org.javaboy.demo.Calculator#minus(int,
方法执行的时候这个拦截器会被触发额外的工作就可以在这个方法中完成**
System.currentTimeMillis();//相当于调用父类的方法因为
动态代理相当于给当前类生成了一个子类在子类中添加了额外的逻辑Object
System.currentTimeMillis();System.out.println(method.getName()
objects);调用到代理方法最后如下配置CGLIB为方法增强
Enhancer();enhancer.setSuperclass(Calculator.class);enhancer.setCallback(new
enhancer.create();System.out.println(calculator.getClass()
calculator.getClass());calculator.minus(3,
4);}这里其实就是创建了字节增强器为生成的代理对象配置superClass然后设置拦截下来之后的回调函数就行了最后通过create方法获取到一个代理对象。
这就是
动态代理和CGLIB动态代理(运行时增强)它会根据我们的配置自动去创建代理对象可以做到零侵入。
但是这并不意味着Spring
AspectJ中的一些注解如Apsect、Before、Pointcut
等并没有使用AspectJ中的编译时增强。
因此大家会发现我们在使用Spring
如果有接口但是也想用CGLIB有java方式和xml(xml有两种)方式如下代码
proxy-target-classtrue/xml第二种方式
proxy-target-classtrueaop:pointcut
com.richfit.richfit.service.XqyServiceImpl.*(..))/aop:aspect
pointcut-refpc1/aop:after-throwing
pointcut-refpc1/aop:after-returning
pointcut-refpc1//aop:aspect/aop:config上面主要是
aop:aspectj-autoproxy/这个注解是用来识别项目中的
EnableAspectJAutoProxy(proxyTargetClass
AOP是基于动态代理实现的它的逻辑是这样如果被代理的对象有接口Spring
AOP底层就会使用JDK动态代理;如果被代理的对象没有接口那么Spring
CGLIB动态代理(动态代理相当于生成了一个子类)所以这就意味着如果方法或者类是
Target/目标对象被拦截下来的对象/要被增强的对象如前面MoneyService、
Point/连接点可以被切面插入的地方方法调用、异常抛出等。
被切面增强的连接点。
Advice/通知/增强切点在连接处执行的代码其实就是把目标方法拦截下来之后要做的事情。
四:AOP做日志通知(xml配置基于springboot项目)
xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance
xmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd!--加载aopadvice-spring.xml
步骤https://pythonjishu.com/uwrtruqtkjkhjud/本项目需要的类LogAdvicexmlaopadvice-spring.xmlapplication.properties中加spring.config.nameaopadvice-springspring.config.locationclasspath:/启动类里面加ImportResource(classpath:aopadvice-spring.xml)--bean
classcom.richfit.richfit.bootConfig.AopLog.LogAdvice
idlogAdvice/aop:configaop:pointcut
com.richfit.richfit.service.XqyServiceImpl.*(..))/aop:aspect
pointcut-refpc1/aop:after-throwing
pointcut-refpc1/aop:after-returning
pointcut-refpc1//aop:aspect/aop:config
spring.config.nameaopadvice-spring
spring.config.locationclasspath:/最后在启动类上加ImportResource(“classpath:aopadvice-spring.xml”)即可。
作为专业的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