Spring AOP的实现原理详解及实例

发布时间 - 2026-01-11 01:08:19    点击率:

Spring AOP的实现原理详解及实例

spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。

以下是JDK动态代理和CGLIB代理简单介绍

    JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。

    CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的Java字节码编辑类库)操作字节码实现的,性能比JDK强。  

在Spring中,有接口时将采用JDK的方式实现proxy代理对象,当没有接口时,将采用cglib中的方式实现prixy代理对象。详情如下:

// JDK方式:PersonService为接口,PersonServiceBean为实现类, 
 
 public class JDKProxyFactory implements InvocationHandler { 
  private Object targetObject; 
   
  public Object createProxyIntance(Object targetObject) 
  { 
  this.targetObject=targetObject; 
  return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),  
   this.targetObject.getClass().getInterfaces(), this); 
  } 
 
public Object invoke(Object proxy, Method method, Object[] args) 
 throws Throwable { 
  PersonServiceBean person=(PersonServiceBean)this.targetObject; 
  Object result=null; 
   if(person.getUser()!=null) 
   {  
   result = method.invoke(targetObject, args); 
   } 
  return result; 
} 
} 
//使用CGlib包实现:PersonServiceBean为实现类,  而没有PersonService接口,      
 
public class CGlibProxyFactory implements MethodInterceptor{ 
 private Object targetObject; 
  
 public Object createProxyInstance(Object targetObject) 
 {  
  this.targetObject=targetObject; 
  Enhancer enhancer=new Enhancer(); 
  enhancer.setSuperclass(this.targetObject.getClass());//设置目标类的子类,该子类会覆盖所有父类中的非final方法 
  enhancer.setCallback(this);//设置回调 
 return enhancer.create(); 
 } 
 
public Object intercept(Object proxy, Method method, Object[] args, 
 MethodProxy methodProxy) throws Throwable { 
 PersonServiceBean person=(PersonServiceBean)this.targetObject; 
  Object result=null; 
   if(person.getUser()!=null) 
   {  
   result = methodProxy.invoke(targetObject, args); 
   } 
 return null; 
} 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Spring  # AOP  # AOP原理  # 深入浅析Spring 的aop实现原理  # 深入理解spring的AOP机制原理  # Spring IOC和aop的原理及实例详解  # Spring AOP面向切面编程实现原理方法详解  # Spring AOP实现原理解析  # Spring AOP注解案例及基本原理详解  # Spring AspectJ AOP框架注解原理解析  # SpringAOP切点函数实现原理详解  # Spring Aop基本流程原理示例详解  # 子类  # 它是  # 希望能  # 它在  # 谢谢大家  # 类似于  # 来完成  # 创建一个  # 回调  # 开源  # 时将  # 类中  # 类库  # InvocationHandler  # class  # prixy  # pre  # java  # PersonService  # PersonServiceBean 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端网站建设与定制开发一站式解决方案 中企动力  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  html5的keygen标签为什么废弃_替代方案说明【解答】  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何自定义错误页面(404, 500)?(代码示例)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Thinkphp 中 distinct 的用法解析  微信h5制作网站有哪些,免费微信H5页面制作工具?  长沙做网站要多少钱,长沙国安网络怎么样?  高防服务器租用首荐平台,企业级优惠套餐快速部署  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何使用Gate和Policy进行授权?(权限控制)  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  利用vue写todolist单页应用  英语简历制作免费网站推荐,如何将简历翻译成英文?  详解Android——蓝牙技术 带你实现终端间数据传输  JavaScript常见的五种数组去重的方式  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何在万网自助建站平台快速创建网站?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel storage目录权限问题_Laravel文件写入权限设置  中国移动官方网站首页入口 中国移动官网网页登录  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Java类加载基本过程详细介绍  怎么用AI帮你为初创公司进行市场定位分析?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  如何快速搭建安全的FTP站点?  ,怎么在广州志愿者网站注册?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在万网主机上快速搭建网站?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  如何为不同团队 ID 动态生成多个独立按钮  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  文字头像制作网站推荐软件,醒图能自动配文字吗?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何利用DOS批处理实现定时关机操作详解  Laravel如何实现文件上传和存储?(本地与S3配置)  Android Socket接口实现即时通讯实例代码