本文节选自<Spring 5核心原理> 1 什么是Spring MVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet.Spring MVC 角色划分清晰,分工明细.由于 Spring MVC 本身就是 Spring 框架的一部分,可以说和 Spring 框架是无缝集成.性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架,最热门的开发技能. 首先从一个由Spring提供的DispatcherServl…
本文节选自<Spring 5核心原理> 接下来我们来完成MVC模块的功能,应该不需要再做说明.Spring MVC的入口就是从DispatcherServlet开始的,而前面的章节中已完成了web.xml的基础配置.下面就从DispatcherServlet开始添砖加瓦. 1 MVC顶层设计 1.1 GPDispatcherServlet 我们已经了解到Servlet的生命周期由init()到service()再到destory()组成,destory()方法我们不做实现.前面我们讲过,这是J…
本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现.我们需要创建一个容器,同时需要一种描述来让容器知道要创建的对象与对象的关系.这个描述最具体的表现就是我们所看到的配置文件. DI(Dependency Injection,依赖注入)就是指对象被动接受依赖类而不自己主动去找,换句话说,就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它依赖的…
本文节选自<Spring 5核心原理> 1 IDEA集成Lombok插件 1.1 安装插件 IntelliJ IDEA是一款非常优秀的集成开发工具,功能强大,而且插件众多.Lombok是开源的代码生成库,是一款非常实用的小工具,我们在编辑实体类时可以通过Lombok注解减少getter.setter等方法的编写,在更改实体类时只需要修改属性即可,减少了很多重复代码的编写工作. 首先需要安装IntelliJ IDEA中的Lombok插件,打开IntelliJ IDEA后单击菜单栏中的File→S…
IOC IOC(Inversion of Control)控制反转:所谓的控制反转,就是把原先需要我们代码自己实现对象的创建和依赖,反转给容器来实现.那么必然Spring需要创建一个容器,同时需要创建一种描述对象与对象之间的依赖关系,这个描述就是Spring的配置文件. 假设我们自己设计Spring框架我们应该怎样考虑: 1.怎么表示对象与对象之间的关系 可以用 xml,properties 文件等语义化配置文件表示. 2.描述对象和对象之间关系的文件存放在哪里 可能是classpath.fil…
Spring事务原理分析-部分一 什么事务 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败. 事务基本特性 ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态. 拿转账来说,假设用户…
Spring事务原理分析-部分二 说明:这是我在蚂蚁课堂学习了余老师Spring手写框架的课程的一些笔记,部分代码代码会用到余老师的课件代码.这不是广告,是我听了之后觉得很好. 课堂链接:Spring手写框架 手写Spring事务框架 编程事务实现 概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理.管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用Trans…
本文转载自Java Reference核心原理分析 导语 带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用ByteBuffer的allocateDirect方法,申请一块堆外内存创建一个DirectByteBuffer对象,然后利用它去操作堆外内存.这些申请完的堆外内存,我们可以回收吗?可以的话是通过什么样的机制回收的? 大家应该都知道WeakHashMap可以用来实现内存相对敏感的本地缓存,为什么WeakHa…
本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)(7) 4 动态数据源切换的底层原理 这里简单介绍一下AbstractRoutingDataSource的基本原理.实现数据源切换的功能就是自定义一个类扩展AbstractRoutingDataSource抽象类,其实相当于数据源的路由中介,可以实现在项目运行时根据相应key值切换到对应的DataSource上…
SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean.FrameworkServlet和 DispatcherServlet. HttpServletBean直接继承自java的HttpServlet,其作用是将Servlet中配置的参数设置到相应的属性: FrameworkServlet初始化了WebApplicationContext,    DispatcherServlet初始化了自身的9个组件(平行而非嵌套);对9个组件做个概览. 共同点:九大组件全…
本文节选自<Spring 5核心原理> 1 Annotation(自定义配置)模块 Annotation的代码实现我们还是沿用Mini版本的,保持不变,复制过来便可. 1.1 @GPService @GPService代码如下: package com.tom.spring.formework.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import j…
本文节选自<Spring 5核心原理> 在之前的源码分析中我们已经了解到,依赖注入(DI)的入口是getBean()方法,前面的IoC手写部分基本流程已通.先在GPApplicationContext中定义好IoC容器,然后将GPBeanWrapper对象保存到Map中.在GPApplicationContext中设计两个Map:factoryBeanObjectCache保存单例对象的缓存,factoryBeanInstanceCache保存GPBeanWrapper的缓存,变量命名也和原生…
本文节选自<Spring 5核心原理> 前面我们已经完成了Spring IoC.DI.MVC三大核心模块的功能,并保证了功能可用.接下来要完成Spring的另一个核心模块-AOP,这也是最难的部分. 1 基础配置 首先,在application.properties中增加如下自定义配置,作为Spring AOP的基础配置: #多切面配置可以在key前面加前缀 #例如 aspect.logAspect. #切面表达式# pointCut=public .* com.tom.spring.demo…
本文节选自<Spring 5核心原理> Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.使用FactoryBean产生或者修饰Bean对象的生成.IoC容器在初始化Bean过程中使用BeanPostProcessor后置处理器对Bean声明周期事件进行管理等. 1 关于延时加载 我们已经知道,IoC容器的初始化过程就是对Bean定义资源的定位.载入和注册,此时容器对Bean的依赖注入并没有发生,依赖注入是在应用程序第一次向容器索取Bean时通过getB…
普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发.Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到Hashmap里供下面的初始化时用.接下来对每个BeanDefinition进行处理,如果是懒加载的则在容器初始化阶段不处理,其他的则在容器初始化阶段进行初始化并依赖注入. 本文我说了很多次 Spring…
本文节选自<Spring 5核心原理> 1 实现思路概述 1.1 从ResultSet说起 说到ResultSet,有Java开发经验的"小伙伴"自然最熟悉不过了,不过我相信对于大多数人来说也算是"最熟悉的陌生人".从ResultSet取值操作大家都会,比如: private static List<Member> select(String sql) { List<Member> result = new ArrayList&l…
一.基本概念和原理 1.Spring事务 基于AOP环绕通知和异常通知的 2.Spring事务分为编程式事务.声明事务.编程事务包括注解方式和扫包方式(xml) Spring事务底层使用编程事务(自己去begin,Commit,Rollback等)+AOP技术进行包装 = 声明式事务 3.事务的特性:ACID 原子性,一致性,隔离性,持久性 1) 原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影…
摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 经过前面几章的分析,相信大家已经对 Spring 中的容器功能有了简单的了解,在前面的章节中我们一直以 BeanFactory 接口以及它的默认实现类 XmlBeanFactory 为例进行分析,但是, Spring还提供了另一个接口 ApplicationContext,用于扩展 BeanFactory 现有的功能. ApplicationContext 和 BeanFact…
SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean.FrameworkServlet和 DispatcherServlet.HttpServletBean直接继承自java的HttpServlet,其作用是将Servlet中配置的参数设置到相应的属性:FrameworkServlet初始化了WebApplicationContext,DispatcherServlet初始化了自身的9个组件. 本篇博客的内容就是对9个组件做个简单概述. 在学习9个组件之前,我…
持续更新... aop跟java代理模式有关. java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 工厂模式用到java反射. aop是面向切面编程,可以理解成这一个面都要用到这个功能,很多方法都要用到这个功能. 是改很多方法,还是找到一个这些方法都要调用的地方?肯定是后者.找到一个这些方法都调用的公共的模块来修改. 业务场景比如日志记录,权限判断 参考 Spring AOP实现原理 Spring AOP 的简单例子…
1.分析spring-boot-starter-parent <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent>他的父项目 <parent> <grou…
一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的 维护集群的元数据用得,集中式,一种叫做gossip 集中式:好处在于,元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到; 不好在于,所有的元数据的跟新压力全部集中在一个地方,可能会导致…
主要内容: 1:分析spring-boot-starter-parent 这个依赖 通过前面几篇文章的学习,我们感受到了spring boot的魅力.最明显的感觉就是pom.xml文件.代码少了很多.其实这主要归功于依赖的parent.下面我们就来看看spring-boot-starter-parent这个依赖为什么有了它很多其他依赖(如spring core等)就不用在引入了. 本文来源:凯哥Java(kaigejava) 个人博客:www.kaigejava.com 公众号:凯哥Java(k…
Spring Security 工作原理概览:https://blog.csdn.net/u012702547/article/details/89629415 spring security执行原理流程:https://blog.csdn.net/weixin_37689658/article/details/92752890 springsecurity全解析:https://www.jianshu.com/p/6b602138ed23 springSecurity深度解析第二版:https…
XXL-CONF是一款轻量级的开源配置中心项目,由国内大牛许雪里开发.下面是官方对其优点作出的描述: 一个轻量级分布式配置管理平台,拥有"轻量级.秒级动态推送.多环境.跨语言.跨机房.配置监听.权限控制.版本回滚"等特性.现已开放源代码,开箱即用. 开源项目地址: https://gitee.com/xuxueli0323/xxl-conf 鄙人有幸拜读了大神的源码,分享一下自己的理解: 项目分为配置中心服务端和客户端两个部分.客户端与服务端通过http接口进行通信. 服务端为客户端提…
Locust工具在市场上不如Loadrunner / JMeter流行,使用的范围也没有那么广,但不可否认其是一款很不错的工具.我个人觉得Locust使用不是那么广泛,主要是因为一下方式: Locust需要一定的Python编程基础,有一定的学习成本. Locust既有的协议支持有,主要有HTTP等.很多协议只要Python支持即可. UI操作界面,很多时候,用户在使用的时候,会考虑上手容易度,Loadrunner/JMeter都有很强的用户交互设计,在客户端强大的功能下面,用户不需要太强的编程…
@EnableAspectJAutoProxy Aop功能开启注解 为容器中导入 @Import(AspectJAutoProxyRegistrar.class)组件,在其重写方法中为 ioc容器 注册 AnnotationAwareAspectJAutoProxyCreator (Aspectj自动代理生成器)保存beandefinition: 明名为 "org.springframework.aop.config.internalAutoProxyCreator";(起名) Ann…
本次主要想写spring bean的实例化相关的内容.创建spring bean 实例是spring bean 生命周期的第一阶段.bean 的生命周期主要有如下几个步骤: 创建bean的实例 给实例化出来的bean填充属性 初始化bea 通过IOC容器使用bean 容器关闭时销毁bean 在实例化bean之前在BeanDefinition里头已经有了所有需要实例化时用到的元数据,接下来spring 只需要选择合适的实例化方法以及策略即可.实例化方法有两大类分别是工厂方法和构造方法实例化,后者是…
这篇文章主要介绍了玩转Koa之核心原理分析,本文从封装创建应用程序函数.扩展res和req.中间件实现原理.异常处理的等这几个方面来介绍,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Koa作为下一代Web开发框架,不仅让我们体验到了async/await语法带来同步方式书写异步代码的酸爽,而且本身简洁的特点,更加利于开发者结合业务本身进行扩展. 本文从以下几个方面解读Koa源码: 封装创建应用程序函数 扩展res和req 中间件实现原理…
事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌握了吗.那么接下来一起看下与Spring相关的事务 概念 事务具有ACID特性. 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. Spring事务的底层依赖MySQL的事务,代码层面上利用AOP实现.MySQL的事务有隔离级别的概念,只有InnoDB有事务,并且实现方式是利用undo log和redo log. AOP方面,有连接点,切点,增强,目标,织…