spring原理

SSH整合

一笑奈何 提交于 2019-11-27 03:24:10
整合原理 web层:struts2+jsp Action对象 service层:JavaBean dao层:Hibernate SessionFactory、session获得、aop事务 spring与struts2整合就是将Action对象交给spring容器负责创建 spring与Hibernate整合就是将SessionFactory交给spring来负责维护,spring负责session的维护以及aop事务 导包 单独配置spring容器 单独配置struts2 struts2与spring整合 单独配置hibernate Hibernate与spring整合 spring整合Hibernate spring整合C3P0连接池 spring整合Hibernate环境操作数据库 扩大session作用范围 来源: https://blog.csdn.net/weixin_42651123/article/details/99308778

深入理解Spring的容器内事件发布监听机制

删除回忆录丶 提交于 2019-11-26 22:47:53
目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监听 4.Spring事件监听源码解析 4.1 初始化事件发布器流程 4.2 注册事件监听器流程 4.3 容器事件发布流程 5.总结 1. 什么是事件监听机制 在讲解事件监听机制前,我们先回顾下设计模式中的观察者模式,因为事件监听机制可以说是在典型观察者模式基础上的进一步抽象和改进。我们可以在JDK或者各种开源框架比如Spring中看到它的身影,从这个意义上说,事件监听机制也可以看做一种对传统观察者模式的具体实现,不同的框架对其实现方式会有些许差别。 典型的观察者模式将有依赖关系的对象抽象为了观察者和主题两个不同的角色,多个观察者同时观察一个主题,两者只通过抽象接口保持松耦合状态,这样双方可以相对独立的进行扩展和变化:比如可以很方便的增删观察者,修改观察者中的更新逻辑而不用修改主题中的代码。但是这种解耦进行的并不彻底,这具体体现在以下几个方面: 1.抽象主题需要依赖抽象观察者,而这种依赖关系完全可以去除。 2.主题需要维护观察者列表,并对外提供动态增删观察者的接口, 3.主题状态改变时需要由自己去通知观察者进行更新。 我们可以把主题(Subject)替换成事件(event)

Spring Boot @EnableAutoConfiguration解析

不问归期 提交于 2019-11-26 22:15:13
  刚做后端开发的时候,最早接触的是基础的spring,为了引用二方包提供bean,还需要在xml中增加对应的包<context:component-scan base-package="xxx" /> 或者增加注解@ComponentScan({ "xxx"})。当时觉得挺urgly的,但也没有去研究有没有更好的方式。      直到接触Spring Boot 后,发现其可以自动引入二方包的bean。不过一直没有看这块的实现原理。直到最近面试的时候被问到。所以就看了下实现逻辑。      使用姿势      讲原理前先说下使用姿势。      在project A中定义一个bean。      package com.wangzhi;      import org.springframework.stereotype.Service;      @Service      public class Dog {      }      并在该project的resources/META-INF/下创建一个叫spring.factories的文件,该文件内容如下      org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wangzhi.Dog      然后在project B中引用project

spring ioc容器和spring mvc 容器--------浅谈!!

泄露秘密 提交于 2019-11-26 21:53:56
之前一直不理解,为啥项目中的web.xml要配置2个上下文! 即: <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>  <servlet-mapping>     <servlet-name>court</servlet-name>     <url-pattern>/</url-pattern>   </servlet-mapping>   <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/court-service.xml</param-value> </context-param>     <listener>       

Spring事件监听器源码

此生再无相见时 提交于 2019-11-26 21:18:18
Spring 自定义了继承 JDK 事件监听器的接口 ApplicationListener<E extends ApplicationEvent> extends EventListener ,用来监听 Spring 应用程序中的事件;自定义了继承 JDK 事件对象的抽象类 ApplicationEvent extends EventObject ,用来表示 Spring 应用程序中的事件类型。容器启动刷新过程中,可以定义事件监听器,来监听应用程序上下文事件 ApplicationContextEvent extends ApplicationEvent ,它有四个具体的实现类: ContextStartedEvent/ContextRefreshedEvent/ContextStoppedEvent/ContextClosedEvent ,分别表示容器启动/刷新/停止/关闭的事件。 通常有两种方式来实现 Spring 中的事件监听: 1.实现 ApplicationListener 接口 public class MyListener implements ApplicationListener<ApplicationEvent> { @Override public void onApplicationEvent(ApplicationEvent event) {

Spring Boot @EnableAutoConfiguration解析

泄露秘密 提交于 2019-11-26 19:56:51
刚做后端开发的时候,最早接触的是基础的spring,为了引用二方包提供bean,还需要在xml中增加对应的包 <context:component-scan base-package="xxx" /> 或者增加注解 @ComponentScan({ "xxx"}) 。当时觉得挺urgly的,但也没有去研究有没有更好的方式。 直到接触Spring Boot 后,发现其可以自动引入二方包的bean。不过一直没有看这块的实现原理。直到最近面试的时候被问到。所以就看了下实现逻辑。 使用姿势 讲原理前先说下使用姿势。 在project A中定义一个bean。 package com.wangzhi; import org.springframework.stereotype.Service; @Service public class Dog { } 并在该project的 resources/META-INF/ 下创建一个叫 spring.factories 的文件,该文件内容如下 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wangzhi.Dog 然后在project B中引用project A的jar包。 projectA代码如下: package com.wangzhi

Spring事务源码

柔情痞子 提交于 2019-11-26 19:39:19
启动事务 @EnableTransactionManagement 注解来启用事务能力。 参数解释 proxyTargetClass:默认为false,表示使用 JDK 的代理模式,true表示用 CGLib 的代理模式,仅在 mode 是 PROXY 时才有效。 mode:默认为PROXY,表示使用 AOP 代理来实现事务,ASPECTJ表示用 ASPECTJ 来实现事务,ASPECTJ 相比 PROXY 减少了一些使用限制,比如支持在同一个类内部方法调用。 order:事务通知执行的顺序,默认优先级最低 @Transactional 可以标注在类、接口、方法上,表示应用事务机制, 参数解释 value/transactionManager:如果有多个事务管理器时,指定一个事务管理器 propagation:事务传播类型,默认 REQUIRED。还有 SUPPORTS/MANDATORY/REQUIRES_NEW/NOT_SUPPORTED/NEVER/NESTED isolation:事务隔离级别,默认为数据库的隔离级别,包括 READ_UNCOMMITTED/READ_COMMITTED/REPEATABLE_READ/SERIALIZABLE timeout:事务超时时间 readOnly:是否只读,默认false rollbackFor:指定哪种类型的异常需要回滚

Spring事物的传播

放肆的年华 提交于 2019-11-26 18:32:40
spring的事物对于同一个类内部调用是不会生效的。 比如一个ServiceA,里面有个方法x()和y()。其中x没有配置事物,而y配置的有实物。如果是一个没有事物的ServiceB调用了ServiceA的x方法,而在x里面直接通过this.y()的方式调用y方法。那么y是不会有实物的,就算配置成PROPAGATION_REQUIRED 也是不会有事物的。 反之,如果是没有事物的ServiceB先调用的ServiceA的y,而y又内部调用x这时候是有事物的。 原理很简单,只有被spring托管的调用方式它才能在外层封装事物。 execution(* com.aaa.someDao.*(..)) 第一个* 号表示任意返回值,后面的*(..)表示任意参数 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

spring事务和jdbc事务

强颜欢笑 提交于 2019-11-26 18:00:33
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。 spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。 真正的数据库层的事务提交和回滚是通过binlog或者redo

Spring源码学习

坚强是说给别人听的谎言 提交于 2019-11-26 17:56:26
每次想着Spring源码的时候总是担心这座大山太过庞大难以消化,但当真正学习了spring源码后才发现阅读源码并没有我们想象中困难,此篇文章用于帮助那些像我一样第一次阅读Spring源码的同学。 在分析Spring源码之前想必大家对Spring的功能使用应该是比较熟悉了,让我们先看看Spring的各个功能模块,让大家对Spring还是有个整体概念: 各个功能模块的作用就不一一介绍,本次源码解读我们主要分为以下几个方面: 1. Spring容器初始化过程 2. AOP的实现原理 3. tx事务实现原理 4. SpringMVC整合 下面开始我们的Spring之旅吧...................................... 来源: https://blog.csdn.net/u012417552/article/details/98995875