spring原理

浅析spring boot自动配置原理

不打扰是莪最后的温柔 提交于 2019-12-02 04:43:52
spring boot 源码刨析: 1、spring boot 启动类 @SpringBootApplication public class MgmtApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(MgmtApplication.class); } public static void main(String[] args) { SpringApplication.run(MgmtApplication.class, args); } } 我们看到,MgmtApplication作为入口类,入口类中有一个main方法,这个方法其实就是一个标准的Java应用的入口方法,一般在main方法中使用SpringApplication.run()来启动整个应用。值得注意的是,这个入口类要使用@SpringBootApplication注解声明,它是SpringBoot的核心注解。 2、@SpringBootApplication 源码 @Target({ElementType.TYPE}) @Retention

Spring事务管理机制的实现原理-动态代理 .

自作多情 提交于 2019-12-01 20:31:22
分析一下Spring事务管理机制的实现原理。由于Spring内置AOP默认使用动态代理模式实现,我们就先来分析一下动态代理模式的实现方 法。动态代理模式的核心就在于代码中不出现与具体应用层相关联的接口或者类引用,如上所说,这个代理类适用于任何接口的实现。下面我们来看一个例子。 public class TxHandler implements InvocationHandler { private Object originalObject; public Object bind(Object obj) {  this.originalObject = obj;  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  Object result = null;  if (!method.getName().startsWith("save")) {   UserTransaction tx = null;   try {    tx =

spring 事务(1)

隐身守侯 提交于 2019-12-01 20:28:15
spring的事务是spring aop应用的典范。本文从以下几个方面入手来看看事务在spring中是如何实现的。 1、事务基础知识 2、spring事务的配置形式有哪些 3、spring事务的关键类 4、问题 #事务基础知识 ##数据库层面的事务 说到事务,我们脑海里就应该出现事务的四个特性 原子性、隔离性、一致性、持久性。 ' 四种隔离 级别 1、序列化:串行化 2、可重复读:可重复读(会出现幻读) 3、读已提交:读已提交数据(会出现不可重复读和幻读) 4、读未提交:读未提交数据(会出现脏读,不可重复读和幻读) ##spring层面的事务 spring层面的事务和mysql的事务有所不同。 四个特性 原子性、隔离性、一致性、持久性。 五种隔离级别 ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 另外四个与JDBC的隔离级别相对应 ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。 ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 ISOLATION

Spring事务采坑 —— timeout

感情迁移 提交于 2019-12-01 13:38:59
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_18860653/article/details/79907984 问题描述 在使用Spring 事务的时候,加上了timeout的限制,@Transactional(timeout = 10),发现事务不会因为超时回滚。 功能描述 所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。 默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。 问题原因 Spring事务超时 = 事务开始时到最后一个Statement创建时时间 + 最后一个Statement的执行时超时时间(即其queryTimeout)。所以在在执行Statement之外的超时无法进行事务回滚。 解决办法 举个例子 @Transactional(timeout = 2, rollbackFor = Exception.class,isolation = Isolation.DEFAULT) public void createOrder(Integer

Spring Cloud底层原理

孤人 提交于 2019-12-01 09:41:00
Spring Cloud底层原理 1|0概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。 实际上,Spring Cloud是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件入手,来剖析一下其底层的工作原理。也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。 2|0业务场景介绍 先来给大家说一个业务场景,假设咱们现在开发一个电商网站,要实现支付订单的功能,流程如下: 创建一个订单之后,如果用户立刻支付了这个订单,我们需要将订单状态更新为“已支付” 扣减相应的商品库存 通知仓储中心,进行发货 给用户的这次购物增加相应的积分 针对上述流程,我们需要有订单服务、库存服务、仓储服务、积分服务。整个流程的大体思路如下: 用户针对一个订单完成支付之后,就会去找订单服务,更新订单状态 订单服务调用库存服务,完成相应功能 订单服务调用仓储服务,完成相应功能 订单服务调用积分服务,完成相应功能 至此,整个支付订单的业务流程结束 下图这张图,清晰表明了各服务间的调用过程: 拜托,面试请不要再问我Spring

web.xml中的contextConfigLocation在spring中的作用

不打扰是莪最后的温柔 提交于 2019-12-01 07:24:55
一、Spring如何使用多个xml配置文件   1、在web.xml中定义contextConfigLocation参数,Spring会使用这个参数去加载所有逗号分隔的xml文件,如果没有这个参数,Spring默认加载web-inf/applicationContext.xml文件。   例如: <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:conf/spring/applicationContext_core*.xml, classpath*:conf/spring/applicationContext_dict*.xml, classpath*:conf/spring/applicationContext_hibernate.xml, </param-value> </context-param> contextConfigLocation 参数的<param-value>定义了要装入的 Spring 配置文件。 原理:利用 S ervletContextListener 实现   Spring 提供ServletContextListener 的一个实现类ContextLoaderListener ,该类可以作为listener 使用

Spring注解Component原理源码解析

半城伤御伤魂 提交于 2019-12-01 07:14:57
在实际开发中,我们经常使用Spring的@Component、@Service、@Repository以及 @Controller等注解来实现bean托管给Spring容器管理。Spring是怎么样实现的呢?我们一起跟着源码看看整个过程吧! 照旧,先看调用时序图: public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh(); } Spring启动时,会去扫描指定包下的文件。 public void scan(String... basePackages) { Assert.notEmpty(basePackages, "At least one base package must be specified"); this.scanner.scan(basePackages); } 对应时序图方法1,ClassPathBeanDefinitionScanner#scan。交给ClassPathBeanDefinitionScanner处理。 ClassPathBeanDefinitionScanner 初始化时设置了注解过滤器 public ClassPathBeanDefinitionScanner

问题

戏子无情 提交于 2019-12-01 04:34:46
1、为什么要用 Spring Boot? 2、Spring Boot 的核心配置文件有哪几个?它们的区别是什么? 3、Spring Boot 的配置文件有哪几种格式?它们有什么区别? 4、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 5、运行 Spring Boot 有哪几种方式? 6、Spring Boot 自动配置原理是什么? 7、你如何理解 Spring Boot 中的 Starters? 8、如何在 Spring Boot 启动的时候运行一些特定的代码? 9、SpringBoot 实现热部署有哪几种方式? 10、你如何理解 Spring Boot 配置加载顺序? 11、Spring Boot 如何定义多套不同环境配置? 12、Spring Boot 可以兼容老 Spring 项目吗,如何做? 13、Spring Boot vs Spring MVC vs Spring - 他们如何比较? 14、Spring Boot提供的其他Starter Project Options是什么? 15、Spring Boot 2和Spring 5的最低基准Java版本是什么? 16、Spring Initializr是创建Spring Boot项目的唯一方法吗? 17、为什么我们需要spring-boot-maven-plugin? 18、什么是Spring

Spring MVC 框架搭建及详解

前提是你 提交于 2019-12-01 03:11:44
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。   一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0)   1. jar包引入   Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jar   Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar包   2. web.xml配置(部分) <!-- Spring MVC配置 --> <!-- ====================================== -->