spring原理

一文让你搞懂Spring的统一事务模型

我的未来我决定 提交于 2020-02-06 05:45:48
Spring事务的知识体系 进入主题之前,先来了解一下Spring事务,都有哪些内容: Spring事务包含对 分布式事务 和 单机事务 的支持,我们用的比较多的是单机事务,也就是只操作一个数据库的事务。 单机事务,按照用法分,又可以分为 编程式事务模型 (TransactionTemplate)和 声明式事务模型 (@Transactional注解),后者可以理解为 aop + 编程式事务模型。 编程式事务模型里面涉及到很多知识点,比如统一事务模型、事务传播级别、事务隔离级别等。 我们今天要讲的是其中一点, 统一事务模型 。 希望这次的分享能够让大家,对Spring事务有一个整体性的认识。 不仅仅是Template Spring的统一事务模型,解决的一个核心问题,就是不管你用的是什么数据访问方式,Hibernate、MyBatis抑或是JDBC, 你的Service层的代码都是一样的,不需要做任何变动。 使用@Transactional注解的,相信大家都用过,而且由于注解的实现比较隐晦,不利于我们理解原理,这里就不演示。 下面介绍编程式事务模型, TransactionTemplate : 不管后面你的Dao实现如何变化,上面这一段Service代码都无需修改,而且依旧可以保持事务的逻辑。 Spring是怎么做到的呢? 有人说,是 模板模式 。

Spring Boot自动配置

余生长醉 提交于 2020-02-05 04:30:15
Spring Boot自动配置 原文链接:https://www.jianshu.com/p/a827ecdda99f https://www.bysocket.com/technique/2001.html 一、SpringBoot为我们做了那些配置 自动配置类都存放在spring-boot-autoconfigure-版本号.jar下的org.springframework.boot.autoconfigure中 当我们在application.properties中配置debug=true后启动容器。可以看到服务器初始化的初始化配置 DispatcherServletAutoConfigratio 注册前端控制器 EmbeddedServletContainerAutoConfiguration注册容器类型 HttpMessageConvertersAutoConfiguration注册json或者xml处理器 JacksonAutoConfiguration注册json对象解析器 如果加入其他功能的依赖,springBoot还会实现这些功能的自动配置 二、自动配置原理 1. 外化配置和自动配置 Spring boot 配置,包括自动配置和外化配置 可以键属性外化配置在application.properties应用配置文件,然后在工程中获取该属性。 对于自动配置

Spring整合mybatis, @MapperScan 原理(spring-mybatis)

≯℡__Kan透↙ 提交于 2020-02-04 21:01:02
@MapperScan("com.lz.springboot.mybatis.springbootmybatis.mapper") 定义mapper接口扫面位置 @Import(MapperScannerRegistrar.class) mapper扫描注册器 扫描目标包下的mapper接口 MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware 覆盖 registerBeanDefinitions 方法使用JDK动态代理创建代理对象,并加入spring ioc容器中 ClassPathMapperScanner 注册 basePackage 中的 mapper MapperFactoryBean 工厂bean方式返回具体的代理对象 @Override public T getObject() throws Exception { return getSqlSession().getMapper(this.mapperInterface); } MapperProxyFactory 利用JDK动态代理创建对象 protected T newInstance(MapperProxy<T> mapperProxy) { return (T) Proxy

Spring入门-注解Annotation

不打扰是莪最后的温柔 提交于 2020-02-03 00:01:35
可以删除xml配置文件,在实现类上面添加注解 在配置文件中 我们能配置四种功能 1创建对象 2注入数据 3改变作用范围 4改变生命周期 那么根据注解配置的 也同样可以实现这些 1.创建对象 要使用注解来创建文件,第一件事是要在删除了配置文件里面的配置信息后,你要告诉Spring你用的是注解配置方式,以及你的注解都在哪些类中,即要告诉Spring去扫描那些包 其中要先去找Annotation所需的context标签的约束 注解为:@Component 它可以把指定的类通过反射实例化一个对象存入bean,那么这个bean就是之前配置文件中的value(即class=“…”),那么key(name=”…")是什么呢 其实Component有个属性-value,这个value的值 默认就是配置到的类的 类名(首字母改成小写),实际上就是我们要配置的name。如果不想用默认的只需要手动配置就好了 @Component(value="xxxx")或者@Component("xxx") 除了@Component注解还有其他三种注解 事实上 如果只是想创建对象 这三种注释都可以换着用 是没有区别的 用于注入数据(即把Dao注入到Service) @Autowired 注意 唯一:如果容器里面有多个怎么办,或者没有呢 如果用了这个自动注入的配置:就可以不用set方法—注入的原理是什么?

spring注解开发-IOC

此生再无相见时 提交于 2020-02-01 15:31:40
1. @Configuration, @Bean @Configuration该注解就是用来告诉spring这是配置类 @Bean该注解是用来注册一个bean。类型是返回值的类型,ID默认是用方法名作为ID的;可以在注解中指定ID,@Bean("person") ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); //MainConfig.class是配置类 Person bean = applicationContext.getBean(Person.class); 以上注解主要是用来取代了配置文件application.xml中对bean的定义 2. @ComponentScan 该注解用于包扫描,主要是取代了下面的配置。主要扫描标记有以下注解的:@Controller、@Service、@Repository,@Component <context:component-scan base-package="com.atguigu" use-default-filters="false"></context:component-scan> 属性一:excludeFilters = Filter[]

第二章 Spring bean实例化、IOC、循环依赖笔记

久未见 提交于 2020-02-01 05:56:17
一、 Bean的实例化过程 流程图地址: https://www.processon.com/view/link/5df87156e4b0cfc88c3c18c5 org.springframework.context.support.AbstractApplicationContext#refresh方法中 /* * 这个方法是spring中最重要的方法,没有之一 , 所以这个方法一定要理解要具体看 * 1、bean实例化过程 * 2、ioc * 3、注解支持 * 4、BeanPostProcessor的执行 * 5、Aop的入口 */ // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); 1、 BeanDefinitionRegistryPostProcessor接口 Refresh().invokeBeanFactoryPostProcessors这个方法里面。 BeanDefinitionRegistryPostProcessor这个接口的调用分为三部: 1)调用实现了PriorityOrdered排序接口 2)调用实现了Ordered排序接口 3)没有实现接口的调用 这个接口的理解

异步请求与异步调用的区别

丶灬走出姿态 提交于 2020-02-01 05:20:17
异步请求与异步调用的区别 两者的使用场景不同,异步请求用来解决并发请求对服务器造成的压力,从而提高对请求的吞吐量;而异步调用是用来做一些非主线流程且不需要实时计算和响应的任务,比如同步日志到kafka中做日志分析等。 异步请求是会一直等待response相应的,需要返回结果给客户端的;而异步调用我们往往会马上返回给客户端响应,完成这次整个的请求,至于异步调用的任务后台自己慢慢跑就行,客户端不会关心。 1、异步请求的实现 方式一:Servlet方式实现异步请求 @RequestMapping(value = "/email/servletReq", method = GET) public void servletReq (HttpServletRequest request, HttpServletResponse response) { AsyncContext asyncContext = request.startAsync(); //设置监听器:可设置其开始、完成、异常、超时等事件的回调处理 asyncContext.addListener(new AsyncListener() { @Override public void onTimeout(AsyncEvent event) throws IOException { System.out.println("超时了..

如何理解spring

给你一囗甜甜゛ 提交于 2020-01-31 17:24:06
什么是ioc ioc全称是【Inversion of Control】控制反转,按照字面意思理解,将控制反转过来,这里的控制指的是什么,为什么要进行反转,ioc可以解决什么问题?要回答这些问题,我们需要先了解一下ioc为什么会产生 为什么要有ioc java是一门面向对象的语言,我们的应用程序通过一个个对象之间的相互关联和作用来完成功能,在网上看到一个特别形象的比喻,这里借用一下:这里的每一个齿轮代表一个对象,对象之间彼此紧密咬合形成一个系统,这样的系统对象之间的耦合度非常高,所谓的耦合度就是关系的紧密程度,高耦合度带来的问题显而易见,只要有一个齿轮发生故障,其它齿轮也无法工作,进而整个系统都无法正常工作,这种牵一发而动全身情况如何才能改善呢?看下图:中间这个齿轮好比一个粘合剂将其它几个齿轮粘合起来,所有的齿轮都交由中间这个齿轮管理,试着把中间这个齿轮拿掉我们可以看到这三个齿轮之间彼此毫无关系,即使一个齿轮出了故障,也不会影响到其它齿轮,中间这个齿轮就好比ioc容器,其它齿轮就是对象,可以看出引入了ioc容器,对象之间的耦合度降低了。当我们修改一个对象的时候不需要去考虑其它对象,因为它不会对其它对象造成影响。 ioc的原理 这里说到的ioc容器到底是个什么东东,又是什么让它具有如此神奇的力量? 先来看一下没有ioc容器的时候,对象A依赖对象B

tomcat + spring mvc原理外传:spring mvc与前端的纠葛

穿精又带淫゛_ 提交于 2020-01-31 00:27:44
tomcat + spring mvc原理外传:spring mvc与前端的纠葛 前言 spring mvc的设计思想 spring mvc的前后端一体化模式 spring boot + Thymeleaf的demo spring mvc专职后端模式 spring mvc的RESTful Web服务 前言 本来准备继续分析spring mvc的核心组件HandlerAdapter的原理,这个组件负责将请求体request交由最终的Handler处理,也就是由业务层编写的接口(Controller中的方法)处理,然后将返回的结果传给展示层解析渲染。HandlerAdapter可以说是和业务代码的直接交互层。但是写到一半无法继续了,因为目前spring mvc存在两种模式:一种是系统内统合后端和前端的功能,spring mvc不仅包括后端的代码逻辑,同时实现最后前端页面的渲染和返回;另一种是spring mvc项目只作为后端,返回json或者xml数据,由浏览器请求数据,展示页面。对于这两种方式在生产环境中应用的比例,目前看来似乎是后者更加广泛。spring mvc之所以称为mvc(model, view 和controller),是因为最初的设计思想是秉承综合处理后端(model、controller)和前端(view),这意味着目前的代码中会存在很多第一种情况的逻辑

了解Spring中常见的设计模式-------------------代理模式

拜拜、爱过 提交于 2020-01-28 05:25:29
代理模式(Proxy Pattern) 指为其他对象提供一种代理,以控制对这个对象的访问。 代理对象在客服端和目标对象之间起到中介作用 属于结构型设计模式。 适用场景:保护目标对象,增强目标对象 静态代理:显示声明被代理对象 动态代理:动态配置和替换被代理对象 无法代理final修饰的方法 静态代理 代理类与被代理类属于(1:1)一对一的关系,被代理类新增了某个方法,代理类也需要进行相应的修改,不符合开闭原则。 public interface Person { void saleHouse(); void getName(); } public class HousHolder implements Person { @Override public void saleHouse() { System.out.println("houseHolder sale house"); } @Override public void getName() { System.out.println("the name of house"); } } public class HouseSaler implements Person { private HousHolder housHolder; public HouseSaler(HousHolder housHolder) { this