当前位置: 首页 > news >正文

采集网站如何做在哪个网站可以做酒店预定单

采集网站如何做,在哪个网站可以做酒店预定单,志愿者网站时长码怎么做,上海营业执照查询网上查询模拟 Spring 创建的动态代理类 本文主要目的是从父类和子类继承的角度去分析为什么在 Service 标注的业务类中使用 this 调用方法会造成事务失效。解释在这种情况下 this 为什么是原始类对象而不是代理类对象。 问题描述 在 Service 标注的业务类中#xff0c;如果调用本类…模拟 Spring 创建的动态代理类 本文主要目的是从父类和子类继承的角度去分析为什么在 Service 标注的业务类中使用 this 调用方法会造成事务失效。解释在这种情况下 this 为什么是原始类对象而不是代理类对象。 问题描述 在 Service 标注的业务类中如果调用本类中的方法那么会造成事务失效。原因是因为事务的功能是 Transactional 注解通过 AOP 切面的方式对原始类进行的增强因此事务功能是代理类对象中的方法才具备的。 现在问题来了在 CGLib 的动态代理模式中代理类假设为 UserServiceImplProxy是继承了 UserServiceImpl也就是说代理类是原始类的子类而通过 Spring 容器的 getBean 方法获取到的也是代理类对象那么在主方法中调用 userServiceImplProxy.transactionFailTest() 方法那问题似乎变成了在父类中使用 this 关键字时this 代表的是子类对象还是父类对象 先说结论this 代表的对象是不确定的。 Service public class UserServiceImpl {Autowiredprivate UserMapper userMapper;Autowiredprivate UserServiceImpl userServiceImpl;public void transactionFailTest() {System.out.println(this this);System.out.println(this.getClass() this.getClass());System.out.println(this.getClass().getSuperclass() this.getClass().getSuperclass());// 重点是探究this对象到底是什么为什么this不是代理类对象this.transactionTest();}public void transactionSuccessTest() {// 调用代理类中的方法userServiceImpl.transactionTest();}Transactionalpublic void transactionTest() {userMapper.updatePasswordById(1L, 111111);// if (true) {// throw new RuntimeException(故意制造异常);// }userMapper.updatePasswordById(2L, 222222);} }继承关系中的方法调用 在下面的测试案例中同样是在父类 Parent 中的方法中使用 this 关键字而实际调用的是子类 Child 中的方法。这是因为 main 方法中方法的调用者就是一个 Child 对象所以无论是 Parent 类还是 Child 类中的 this都是指向该调用对象的地址。 /*** 通过super调用父类方法*/ Slf4j public class SuperCallMainDemo {public static void main(String[] args) {Parent parent new Child();log.error(main方法中的调用者对象{}, parent);parent.method01();}static class Child extends Parent {Overridepublic void method01() {log.info(******************************************);super.method01();log.info(******************************************);}Overridepublic void method02() {log.info();super.method02();log.info();}}static class Parent {public void method01() {log.info(Parent执行method01方法, this{}, this);this.method02();}public void method02() {log.info(Parent执行method02方法, this{}, this);}} }在继承中使用反射进行方法调用模拟动态代理类逻辑 在下面的测试案例中和 Spring 通过 CGLIB 动态代理生成的动态代理类的原理相同。虽然代理类是子类但由于是动态生成的所以没有办法通过 super 关键字来直接调用父类中的同名方法因此即使拦截到父类中的方法 m1、m2也还是需要通过 invoke 反射的方式进行调用。因此 this 关键字指向的是 invoke 方法传递过去的父类对象。 /*** 通过反射调用父类方法*/ Slf4j public class InvokeCallMainDemo {public static void main(String[] args) {Parent parent new Parent();log.error(main方法中parent的地址{}, parent);Parent child new Child(parent, Parent.class);log.error(main方法中child的地址{}, child);child.method01();}static class Child extends Parent {Parent target;Class? clazz;Method m1;Method m2;SneakyThrowspublic Child(Parent target, Class? clazz) {this.target target;this.clazz clazz;// 这里模拟代理类拦截父类的所有方法m1 clazz.getMethod(method01);m2 clazz.getMethod(method02);}SneakyThrowsOverridepublic void method01() {log.info(******************************************);// 实际上这里的方法是被拦截下来的m1.invoke(target);log.info(******************************************);}SneakyThrowsOverridepublic void method02() {log.info();m2.invoke(target);log.info();}}static class Parent {public void method01() {log.info(Parent执行method01方法, this{}, this);this.method02();}public void method02() {log.info(Parent执行method02方法, this{}, this);}} }总结 无论是那种调用方式this 都表示实际调用的那个对象不会因为使用 super 关键字而被更改。在反射调用方式中通过 method.invoke(target) 进行调用方法时传递的对象就是 target因此 this 表示的就是 target 对象。动态代理类只能选择这种方式Spring 中的代理类会保存原始类对象通过反射的方式去调用原始类中的方法。这里通过模拟的方式实际上代理类中除了继承隐式地保存一个原始类对象之外还显式地保存了一个原始类对象因为 super 并不能够和 this 一样可以独立作为一个对象引用来使用。
http://www.ho-use.cn/article/10819188.html

相关文章:

  • 软件开发网站建设科技有限公司电商网站开发费用
  • 天猫网站设计分析外贸福步论坛登录
  • 个人备案网站盈利企业网站能提供哪些服务
  • 手机上可以做网站甘肃兰州是几线城市
  • 商务网站建设试卷动漫制作必须会画画吗
  • 精品网站建设费用 在线磐石网络做景区网站建设的公司
  • 寿光网站建设公司wordpress文章页跳转空白
  • 企业网站备案快吗wordpress章节分页
  • 中国建设银行官方网站诚聘英才史上最全设计网站
  • 网站建站后维护需要做哪些好用的wordpress企业模版
  • 平台网站建设报价高明网站开发
  • 国内十大网站排名wordpress图片不能上传图片
  • 哪家网站雅虎全球购做的好重庆网站seo搜索引擎优化
  • 网站设计制作一条龙免费广州海珠网站制
  • 如何设计一个网站微网站 php
  • 射阳建设局网站汕头响应式网站
  • 临沧网站制作做酒店网站
  • 怎么查网站服务器电影网站如何做长尾关键词
  • 网站开发资质现在门户网站建设还有人弄吗
  • 我的世界手机做图的网站上海建设工程造价信息网官网
  • 福州网站设计定制公司网站的建设与颜色搭配
  • 珠海做网站设计海口网络科技有限公司
  • 背景色搭配网站哈尔滨信息网
  • 怎么设计个人网站揭阳网站制作维护
  • 建站网站加盟wordpress插件自动更新
  • 青岛免费网站建设怎样搭建一个个人网站
  • 天津大寺网站建设写作神器 自动生成
  • 手机如何做网站网站是什么时候开始的
  • 建设通网站是免费的吗傻瓜式app制作
  • 专业的o2o网站建设定制类网站