cglib

Spring事务的那些坑,这里都给你总结好了!

≯℡__Kan透↙ 提交于 2020-12-16 09:38:21
Spring框架已是JAVA项目的标配,其中Spring事务管理也是最常用的一个功能,但如果不了解其实现原理,使用姿势不对,一不小心就可能掉坑里。 为了更透彻的说明这些坑,本文分四部分展开阐述:第一部分简单介绍下Spring事务集成的几种方式;第二部分结合Spring源代码说明Spring事务的实现原理;第三部分通过实际测试代码介绍关于Spring事务的坑;第四部分是对本文的总结。 一、Spring事务管理的几种方式: Spring事务在具体使用方式上可分为两大类: 1. 声明式 基于 TransactionProxyFactoryBean的声明式事务管理 基于 <tx> 和 <aop> 命名空间的事务管理 基于 @Transactional 的声明式事务管理 2. 编程式 基于事务管理器API 的编程式事务管理 基于TransactionTemplate 的编程式事务管理 目前大部分项目使用的是声明式的后两种: 基于 <tx> 和 <aop> 命名空间的声明式事务管理可以充分利用切点表达式的强大支持,使得管理事务更加灵活。 基于 @Transactional 的方式需要实施事务管理的方法或者类上使用 @Transactional 指定事务规则即可实现事务管理,在Spring Boot中通常也建议使用这种注解方式来标记事务。 二、Spring事务实现机制

Spring 事务的那些坑,都在这里了!

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-16 08:58:19
作者:蚊子squirrel www.jianshu.com/p/a4229aa79ace Spring框架已是JAVA项目的标配,其中Spring事务管理也是最常用的一个功能,但如果不了解其实现原理,使用姿势不对,一不小心就可能掉坑里。 为了更透彻的说明这些坑,本文分四部分展开阐述: 第一部分简单介绍下Spring事务集成的几种方式; 第二部分结合Spring源代码说明Spring事务的实现原理; 第三部分通过实际测试代码介绍关于Spring事务的坑; 第四部分是对本文的总结。 一、Spring事务管理的几种方式: Spring事务在具体使用方式上可分为两大类: 1. 声明式 基于 TransactionProxyFactoryBean的声明式事务管理 基于 <tx> 和 <aop> 命名空间的事务管理 基于 @Transactional 的声明式事务管理 2. 编程式 基于事务管理器API 的编程式事务管理 基于TransactionTemplate 的编程式事务管理 目前大部分项目使用的是声明式的后两种: 基于 <tx> 和 <aop> 命名空间的声明式事务管理可以充分利用切点表达式的强大支持,使得管理事务更加灵活。 基于 @Transactional 的方式需要实施事务管理的方法或者类上使用 @Transactional 指定事务规则即可实现事务管理,在Spring

为了忽悠大厂面试官,熬夜总结了这些Spring面试题!

这一生的挚爱 提交于 2020-12-14 13:04:22
1.说说Spring 里用到了哪些设计模式? 单例模式 :Spring 中的 Bean 默认情况下都是单例的。无需多说。 工厂模式 :工厂模式主要是通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象。 代理模式 :最常见的 AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理。 模板方法模式 :主要是一些对数据库操作的类用到,比如 JdbcTemplate、JpaTemplate,因为查询数据库的建立连接、执行查询、关闭连接几个过程,非常适用于模板方法。 2.谈谈你对IOC 和 AOP 的理解?他们的实现原理是什么? IOC 叫做控制反转,指的是通过Spring来管理对象的创建、配置和生命周期,这样相当于把控制权交给了Spring,不需要人工来管理对象之间复杂的依赖关系,这样做的好处就是解耦。在Spring里面,主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器,通过他们来实现对 Bean 的管理。 AOP 叫做面向切面编程,他是一个编程范式,目的就是提高代码的模块性。Srping AOP 基于动态代理的方式实现,如果是实现了接口的话就会使用 JDK 动态代理,反之则使用 CGLIB 代理,Spring中 AOP 的应用主要体现在 事务、日志

Kotlin之SpringBoot2.0 Aop使用注意事项

牧云@^-^@ 提交于 2020-12-13 19:33:26
遇到的问题 what 新公司的项目使用Kotlin+SpringBoot作为后台架构,开发中出现了AOP日志切面不生效的问题 为什么会这样 why @Aspect注解的切面类没有初始化到IOC容器中,即没有声明为组件 SpringBoot2.0的AOP代理有三种策略,启动时的AutoConfig配置类是使用CGLIB进行代理,即matchIfMissing=true,spring.aop.proxy-target-class配置项缺失时 Kotlin生成的类和方法如果前缀没有open关键字,编译成字节码文件时会带上final关键字即类不可继承、方法不可重写 CGLIB使用ASM字节码技术进行字节码植入,运行时生成目标类的子类来实现代理,所有如果目标类不可继承、方法不可重写、就无法被cglib代理 以下引用 https://my.oschina.net/u/4575597/blog/4456684 有3种,前提均开启spring.aop.auto=true; 1. jdk动态代理:当spring.aop.proxy-target-class=false, 引入了aspectjweaver依赖时生效 2. cglib代理:当spring.aop.proxy-target-class=true, 引入了aspectjweaver依赖时生效 3. 基础代理:当spring.aop

为了忽悠大厂面试官,熬夜总结了这些Spring面试题!

北战南征 提交于 2020-12-12 23:47:08
前言 如果说 Java 工程师,有什么一定要“死磕”拿下的东西,那一定是 Spring 无疑了。众所周知,Spring 无论在 Java 生态系统,还是在就业市场, Spring Boot、Spring Framework、Spring Data、Spring Cloud、Spring Security、Spring Session等都是Spring Framework 的基石,面试出镜率之高,无出其右。 先分享一个Spring知识点思维导图给大家 1.说说Spring 里用到了哪些设计模式? 单例模式:Spring 中的 Bean 默认情况下都是单例的。无需多说。 工厂模式:工厂模式主要是通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象。 代理模式:最常见的 AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理。 模板方法模式:主要是一些对数据库操作的类用到,比如 JdbcTemplate、JpaTemplate,因为查询数据库的建立连接、执行查询、关闭连接几个过程,非常适用于模板方法。 2.谈谈你对IOC 和 AOP 的理解?他们的实现原理是什么? IOC 叫做控制反转,指的是通过Spring来管理对象的创建、配置和生命周期,这样相当于把控制权交给了Spring

mybatis之动态代理

China☆狼群 提交于 2020-12-12 09:39:06
mybatis之动态代理的应用 在前文(https://www.cnblogs.com/NYfor2018/p/9093472.html)我们知道了,Mybatis的使用需要用到Mapper映射文件,一个是映射接口,另一个是映射XML文件(此处不详谈映射文件XML),在应用中我们可以感觉到,映射接口似乎对接着XML文件中的实现命令,可是我们在运行程序是时候调用的往往是Mapper接口,而不是一个包含逻辑的实现类。很显然Mapper产生了代理类。 首先,什么是代理模式? 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 (取自百度百科: https://baike.baidu.com/item/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/8374046?fr=aladdin ) 举个栗子,如图: 我们租房的时候一般是去找中介,而不是直接去找包租婆。放在代理模式这里来说,就是,我们在访问真实的对象的时候,往往不是直接去访问真实对象,而是通过代理对象,来对真实对象进行访问。 为什么要使用代理模式? 通过代理,一方面可以控制如何访问真正的服务对象,提供额外的服务。另外一方面有机会通过重写一些类来满足特定的需要。 就像是

JVM学习思考

孤人 提交于 2020-12-11 13:35:37
  毕业以来技术上一直没有太大进步,仔细一想可能是没有做技术分享,我喜欢把学习总结记录在印象笔记中,那么理解的是对是错也就没人能评判一下。为了技术进步,接下来将陆续把一些学习总结迁移到博客园中,欢迎大家多多指正! JVM的定义 Jvm Java虚拟机。一次编译,到处运行的前提 Jre JVM+核心类库 Jdk JVM+核心类库+扩展类库 JMM Java内存模型。主要用于多线程共享数据 子模块 自动内存管理(分配、回收内存)、虚拟机执行子系统(类加载机制、虚拟机字节码执行引擎) JVM运行时数据区 JDK8以后: (图摘自java3y) 程序计数器: 当前线程所执行的字节码的行号指示器。 Java虚拟机栈: Java方法执行的内存模型:每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等。 本地方法栈: 为虚拟机执行的native方法服务。 Java堆: 存放对象实例。 常量池:常量池记录的是代码出现过的常量、类名、成员变量等以及符号引用(类引用、方法引用,成员变量引用等)。 方法区(元空间): 存储已被虚拟机加载的类元数据信息。 内存溢出: 内存不够用。OutOfMemoryError: Java heap space、StackOverFlowError、OutOfMemoryError: Metaspace 内存泄漏: 无用内存未及时回收

【鼠年大吉】【设计模式自习室】详解代理模式

a 夏天 提交于 2020-12-11 07:49:39
前 言 马上就要迎接新年了,在这里祝爱学习的你们,鼠年大吉,新的一年学习进步,升职加薪。 新春佳节期间,多花点时间陪陪家人朋友同学~不用过度沉迷学习,哈哈~ 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 应用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇: 为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 【设计模式自习室】理解工厂模式的三种形式 【设计模式自习室】适配器模式 【设计模式自习室】幕后英雄:装饰模式 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化 【设计模式自习室】门面模式 Facade Patter 【设计模式自习室】享元模式:减少对象数量 结构型——代理模式 Proxy Pattern 引子 通俗的来讲,代理模式就是我们生活中常见的 中介 。在某些情况下

再也不怕aop的原理了

一世执手 提交于 2020-12-07 04:29:34
1 aop是什么   java的核心思想是面向对象,aop是面向切面编程.是对面向对象的一个补充,简单通俗的理解下aop,假设我们上楼梯,我的目标是三楼,我直接朝我的三楼直接过去,但是我可以在二楼的时候去朋友那里玩下,坐下其他的,然后再去三楼 这也不会影响我们的目标去三楼,那么去朋友那里玩,相当于增加的生活的乐趣去那里玩.相当于增强了我们的活动.   那么aop可以做啥呢,可以进行日志记录,可以进行事务管理,可以进行安全控制,可以进行异常处理,可以进行性能统计 2 理解几个关键字 切面 关注点形成的类,就叫 切面(类)! 面向切面编程,就是指对很多功能都有的重复的代码抽取,再在运行的时候网业务方法上动态植入“切面类代码” 切点 执行目标对象方法,动态 植入切面代码。 可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。 通知 在对象上面执行的内容 3 aop的实现原理: aop的底层实现是代理模式加反射. 反射就不用多讲了,代理模式分为多种,静态代理和动态代理,动态代理面又分为jdk动态代理和cglib动态代理 代理模式的好处:可以防止对方得到我们真实的方法; 静态代理的实现方式: package com.cxy.cyclicBarrier; /* * * Created by Administrator on 2017/4/24. */

[Java复习] Spring IoC

流过昼夜 提交于 2020-11-30 00:41:06
1. Spring bean的生命周期? 1. 对Bean进行实例化(相当于new) 对于BeanFactory 当客户向容器请求一个尚未初始化的bean(或初始化bean需要注入另外一个尚未初始化的依赖bean)时,容器会调用createBean进行实例化。 例如XmlBeanFactory通过Resource装载Spring配置信息启动Ioc容器,然后通过BeanFactory.getBean获取Bean。注意是, 启动 IoC容器时,不会初始化Bean,初始化是在getBean调用时。 容器通过获取BeanDefinition对象中的信息进行实例化,这步只是实例化,并没有依赖注入。 实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口。 BeanWrapper是对Bean的包装, 一般情况下是在spring ioc内部使用,提供了访问bean的属性值、属性编辑器注册、类型转换等功能,方便ioc容器用统一的方式来访问bean的属性. 对于ApplicationContext 当容器启动结束后,便已经实例化所有的bean。 2. 设置对象属性(依赖注入) 实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。 紧接着,Spring根据BeanDefinition中的信息进行依赖注入