spring原理

Spring读取xml配置文件的原理与实现

你说的曾经没有我的故事 提交于 2019-11-29 05:01:15
1. Spring读取xml配置文件的原理与实现 https://www.cnblogs.com/wyq178/p/6843502.html 2.首先使用xml配置文件的好处是参数配置项与代码分离,便于管理以及日后的维护和修改。 其次,xml是标准化的树节点文档,通用性强。 第三,在一个采用SSH2框架的java web项目中,容器在初次启动的时候,会先读取 web.xml ,如果 web.xml 里面配置了spring和 struts2 的监听器,则会通过监听器的配置路径找到spring和struts的配置文件。srping的配置文件是applicationContext.xml,而 struts2 的配置文件是struts.xml。至于底层解析可能是采用 dom解析 方式。 再来接着说解析后被调用的过程: 当容器启动并读取 web.xml 的时候,如果发现有配置监听器,则会先进入监听器的初始化方法,并执行里面的代码逻辑。spring监听器的配置为: <!-- spring整合 struts2 的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--

spring中expose-proxy的作用与原理

做~自己de王妃 提交于 2019-11-28 22:31:52
也就是说我们首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强,即进入目标方法之前开启事务,退出目标方法时提交/回滚事务 1、测试代码如下: 1 public interface AService { 2 public void a(); 3 public void b(); 4 } 5 6 @Service() 7 public class AServiceImpl1 implements AService{ 8 @Transactional(propagation = Propagation.REQUIRED) 9 public void a() { 10 this.b(); 11 } 12 @Transactional(propagation = Propagation.REQUIRES_NEW) 13 public void b() { 14 } 15 } 2、问题: 目标对象内部的自我调用将无法实施切面中的增强,如图所示 此处的this指向目标对象,因此调用this.b()将不会执行b事务切面,即不会执行事务增强,因此b方法的事务定义“@Transactional(propagation = Propagation.REQUIRES_NEW)”将不会实施

Spring事务失效

不羁的心 提交于 2019-11-28 18:07:46
面试必备技能:JDK动态代理给Spring事务埋下的坑 一、场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1、场景A: 这里其实是分别执行了两个事物,执行的结果是两个方法都可以插入数据!如下: 2、场景B: 修改上述代码如下: Propagation.REQUIRES_NEW的含义表示:如果当前存在事务,则挂起当前事务并且开启一个新事物继续执行,新事物执行完毕之后,然后在缓刑之前挂起的事务,如果当前不存在事务的话,则开启一个新事物。 执行的结果是两个方法都可以插入数据!执行结果如下: 场景A和场景B都是正常的执行,期间没有发生任何的回滚,假如child()方法中出现了异常! 3、场景C 修改child()的代码如下所示,其他代码和场景B一样: 执行结果如下,会出现异常,并且数据都没有插入进去: 疑问1:场景C中child()抛出了异常,但是parent()没有抛出异常,按道理是不是应该parent()提交成功而child()回滚? 可能有的小伙伴要说了,child()抛出了异常在parent()没有进行捕获,造成了parent()也是抛出了异常了的!所以他们两个都会回滚! 4、场景D 按照上述小伙伴的疑问这个时候,如果对parent()方法修改

Hibernate4 No Session found for current thread原因

為{幸葍}努か 提交于 2019-11-28 14:27:18
Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for current thread”, 这个错误的原因,网上有很多解决办法, 但具体原因的分析,却没有多少, 这里转载一个原理分析: SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionContext的实现,SessionFactory将调用CurrentSessionContext的currentSession()方法来获得Session。在Spring中,如果我们在没有配置TransactionManager并且没有事先调用SessionFactory.openSession()的情况直接调用getCurrentSession(),那么程序将抛出“No Session found for current thread”异常。如果配置了TranactionManager并且通过@Transactional或者声明的方式配置的事务边界,那么Spring会在开始事务之前通过AOP的方式为当前线程创建Session,此时调用getCurrentSession()将得到正确结果。 然而

Spring与Mybatis整合的MapperScannerConfigurer

好久不见. 提交于 2019-11-28 10:21:48
本文将分析mybatis与spring整合的MapperScannerConfigurer的底层原理,之前已经分析过 Java 中实现 动态 ,可以使用jdk自带api和cglib第三方库生成动态代理。本文分析的mybatis版本3.2.7,mybatis-spring版本1.2.2。 MapperScannerConfigurer介绍 MapperScannerConfigurer是spring和mybatis整合的mybatis-spring jar包中提供的一个类。 想要了解该类的作用,就得先了解MapperFactoryBean。 MapperFactoryBean的出现为了代替 手工 使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。 比如下面这个官方文档中的配置: <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value=http://www.cnblogs.com/fangjian0423/p/"org.mybatis.spring.sample.mapper.UserMapper" /> org.mybatis

数据库事务和spring事务的区别

微笑、不失礼 提交于 2019-11-28 08:05:30
数据库事务和spring事务 本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.事务与隔离级别放在一起理解会更好些. 来源: https://www.cnblogs.com/YuyuanNo1/p/11401132.html

Spring如何解决循环依赖

こ雲淡風輕ζ 提交于 2019-11-28 07:45:26
今天我们来了解下Spring是如何解决循环依赖的。 准备工作: 1.测试代码 创建CurrentlyService1和CurrentlyService2。两个类分别依赖注入对方 2.了解@Autowire原理。 对于这次探索循环依赖,如果不知道的,就当他是针对这个属性调用createBean。 3.ObjectFactory接口。 他有一个getObject方法。其实就是为了提早曝光object 4.DefaultSingletonBeanRegistry中的三个map。 singletonObjects 存放已经创建好的bean对应的object。beanName->object singletonFactories 存放beanName对应的ObjectFactory。beanName->ObjectFactory earlySingletonObjects 存放beanName对应的ObjectFactory.getObject。beanName->object 4.1和4.3对应存放的object有什么实质性区别? 开始逐步分析 创建bean的前面我们不分析了。直接到AbstractAutowireCapableBeanFactory#doCreateBean 实例化之后。 1.将bean提早曝光 boolean earlySingletonExposure = (mbd

MySQL隔离性及Spring事务

℡╲_俬逩灬. 提交于 2019-11-28 05:45:28
一、数据库事务ACID特性   必须要掌握事务的4个特性,其中事务的隔离性之于MySQL,对应4级隔离级别。 原子性(Atomicity):     事务中的所有原子操作,要么都能成功完成,要么都不完成,不能停滞在中间环节。发生错误要回滚至事务开始前状态,仿佛事务没有发生过。 一致性(Consistency):     事务必须始终保持数据库系统处于一致的状态,无论并发多少事务。 隔离性(Isolation):     事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要存在相互隔离。 [MySQL隔离级别] 持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。 二、MySQL隔离级别 1 select @@tx_isolation ; --查询MySQL隔离级别 2 set <level> tx_isolaction = 'READ-COMMITTED'; --设置事务隔离级别level分为session默认,global全局 3 start transaction ; -- 启动事务 4 set savepoint <point_name> ; --设置回滚点,mysql支持回滚点 5 rollback ; -

【面试】Spring 执行流程

半城伤御伤魂 提交于 2019-11-28 05:12:50
Spring Aop的实现原理: AOP 的全称是 Aspect Orient Programming ,即面向切面编程。是对 OOP (Object Orient Programming) 的一种补充,专门用于处理一些具有横切性质的服务。常常用于日志输出、、安全控制等。 AOP(面向切面编程思想)主要是的实现技术有 Spring AOP 和 AspectJ。 AspectJ 的底层技术:AspectJ 的底层技术是静态代理,即用一种AspectJ 支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增i强,相对于下面说的运行时增强,编译时增强的性能更好。 Spring AOP : Spring AOP 采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP 提供了对 JDK 动态代理的支持以及 CFLib的支持。 JDK 动态代理只能为接口创建动态代理实力,而不能对类创建动态代理。需要获得被目标类的接口信息(应用 JAVA 的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用 invokeHandler 方法来处理。   CGLib 动态代理需要依赖ASM包,把代理对象类的

SpringBoot(二) -- SpringBoot配置

送分小仙女□ 提交于 2019-11-28 05:12:02
一.配置文件   SpringBoot可以使用两种类型的配置文件(文件名固定):   application.properties   application.yml   配置文件的作用就是来修改SpringBoot自动配置的默认值:SpringBoot在底层都给我们配置好了所有的配置信息   yml:YAML(YAML Ain't a Markup Language):新型配置文件.以前的配置文件大都使用到的是"xxx.xml"文件,YML以数据为中心,更适合做配置文件; 二.YML语法   1.基本语法     k:(空格)v --表示一对键值对(空格必须有);     以空格的缩进来控制层级关系: 只要是左对齐的一列数据,都是同一层级的,且属性和值都是大小写敏感的   2.值的写法     字面量: 普通的值(数字,字符串,布尔): key: value,字符串不用加引号:       ""字符串:不会转义字符串中的特殊字符,特殊字符会作为本身想要表示的意思         "zhangsan \n lisi" 输出: zhangsan 换行 lisi       ' '字符串: 特殊字符不会进行转义,特殊字符最终只是一个普通的字符串数据     对象,Map(属性和值)(键值对):       k: v:    //在下一行来写对象的属性和值的关系,要用空格控制好缩进