自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 收藏
  • 关注

原创 Spring 注解驱动原理(四):使用 annotatedClass 构造之 ConfigurationClassPostProcessor

入参为 ConfigureClass 之 ConfigurationClassPostProcessor 处理postProcessBeanDefinitionRegistry() public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { int registryId = System.identityHashCode(registry); if (this.regis

2021-02-28 18:51:27 35 2

原创 Spring 注解驱动原理(三):使用 annotatedClass 构造之注册配置类

入参为 ConfigureClass当创建注解处理容器时,如果传入的初始参数是具体的注解Bean定义类时,注解容器读取并注册。AnnotationConfigApplicationContext 通过调用注解Bean定义读取器AnnotatedBeanDefinitionReader 的 register() 方法向容器注册指定的注解Bean,注解Bean定义读取器向容器注册注解Bean的源码如下:// 注册多个注解Bean定义类public void register(Class<?&gt

2021-02-28 00:55:13 66

原创 Spring 注解驱动原理(二):使用 basePackages 构造

入参为 basePackages先看调用时序图:public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh();}Spring启动时,会去扫描指定包下的文件。public void scan(String... basePackages) { Assert.notEmpty(basePackages, "At least

2021-02-28 00:55:01 97

原创 Spring 注解驱动原理(一):AnnotationConfigApplicationContext 两类构造方法

SpringIOC 容器对于类级别的注解和类内部的注解分以下两种处理策略:类级别的注解:如@Component、@Repository、@Controller、@Service 以及 JavaEE6 的 @ManagedBean和@Named 注解,都是添加在类上面的类级别注解,Spring容器根据注解的过滤规则扫描读取注解Bean定义类,并将其注册到Spring IOC 容器中。类内部的注解:如@Autowire、@Value、@Resource以及EJB 和 WebService 相关的注解等,都

2021-02-28 00:54:51 74 2

原创 仿写简易 ORM 框架

在前面的文章我们分析了 MyBatis 的底层执行原理,现在我们也来自己实现一个简易的 ORM 框架,在架构上去模仿 MyBatis。跟平时开发软件一样,我们首先要做的就是明确需求。现在我有一个 User 表,有如下四个字段:所以我希望能像使用 mybatis 那样通过一个 UserMapper 加一个配置文件去实现数据库操作。1.用户模块1)数据库表对应的实体类public class User { private long uid; private String name;

2021-02-28 00:54:32 8

原创 【MyBatis】Spring集成原理(四):分析注入 MapperProxy

我们已经分析了 MyBatis 是如何实现自定义注册 Mapper 接口到 IOC 容器中的,最后我们看到 BeanDefinition 中实际保存的是 MapperFactoryBean.class。可以看到 MapperFactoryBean 实现了 FactoryBean 接口(表明是一个工厂bean),所以 getBean() 最终返回的并不是它自己,而是 getObject 中创建的对象。PS:关于 FactoryBean 可以参考 【Spring】IOC&DI:FactoryBe

2021-02-28 00:54:21 46

原创 【MyBatis】Spring集成原理(三):MapperFactoryBean 与 SqlSessionTemplate

在 Spring 里面,我们不是直接使用 DefaultSqlSession 的,而是对它进行了一个封装,这个 SqlSession 的实现类就是SqlSessionTemplate。这个跟 Spring 封装其他的组件是一样的,比如 JdbcTemplate,RedisTemplate 等等,也是 Spring 跟 MyBatis 整合的最关键的一个类。为什么不用直接使用 DefaultSqlSession?DefaultSqlSession 是线程不安全的。因为 SqlSession 的生命周期是

2021-02-28 00:54:04 50

原创 【MyBatis】Spring集成原理(二):分析注入 MapperScannerConfigurer

在上一篇我们分析了 Spring 中不再使用 DefaultSqlSession 因为它是线程不安全的,而是自己实现了一个线程安全 SqlSessionTemplate。按照编程式使用的套路,拿到 SqlSession 后就可以去操作数据库了,所以我们演示通过 SqlSessionDaoSupport 去获取 SqlSessionTemplate 操作数据库。但是这么做仍然存在代码冗余(需要手动创建Mapper实现类去获取SqlSessionTemplate)和硬编码的问题(指定 StatementID,

2021-02-28 00:53:52 47 1

原创 【MyBatis】Spring集成原理(一):分析注入 SqlSessionFactoryBean

在上一篇我们演示了 Spring 如何整合 MyBatis;那么问题来了,会话工厂 SqlSessionFactory 是什么时候创建的?为了解开其中奥秘,我们就从 Spring 集成时配置的 SqlSessionFactoryBean 源码看起…SqlSessionFactoryBeanSqlSessionFactoryBean 从名字就能看出来它是用来创建工厂类的,继承关系如下:其中,InitializingBean 接口为 bean 提供了初始化方法的方式,它只包括 afterProperti

2021-02-27 20:24:10 29

原创 【MyBatis】Spring 集成 MyBatis 及问题分析

在 【MyBatis】基本使用(一):编程式使用(单用)及核心对象生命周期 一文中我们看到了如何单独使用 mybatis,但在实际开发中我们却很少单独使用它,而是整合到 Spring 中去使用。经过前面几篇文章的分析,我们已经了解了 mybatis 的底层执行原理,认识了 mybatis 原生API 中三个核心对象:SqlSessionFactory、SqlSession、MapperProxy。【MyBatis】执行原理(一):创建会话工厂(SqlSessionFactory) --配置解析源码分

2021-02-27 20:23:25 6

原创 【Mybatis】延迟加载原理

延迟加载延迟加载如何使用Setting 参数配置设置参数描述有效值默认值lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。true、falsefalseaggressiveLazyLoading当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods).true、falsefalse

2021-02-27 20:18:25 59

原创 【Mybatis】ResultSetHandler 封装对象流程

ResultSetHandler前言结果封装原理<resultMap type="Person" id="resultPersonMap"> <result property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result

2021-02-27 20:17:49 7

原创 【Mybatis】PageHelper 分页插件原理

PageHelper 分页插件原理1. PageHelper的maven依赖及插件配置<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version></dependency>PageHelper除了本身的jar包外,它还依赖了一个叫j

2021-02-27 20:17:04 55

原创 【MyBatis】插件机制源码解析

插件机制详解MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截MyBatis中的哪些内容呢?概述MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 拦截执行器的方法ParameterH

2021-02-27 20:16:26 25

原创 【Mybatis】缓存机制源码解析

前言MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐患。个人在业务开发中也处理过一些由于MyBatis缓存引发的开发问题,带着个人的兴趣,希望从应用及源码的角度为读者梳理MyBatis缓存机制。本次分析中涉及到的代码和数据库表均放在GitHub上,地址: mybatis-cache-demo 。目录本文按照以下顺序展开。一级缓存介绍及相关配置。一

2021-02-27 20:15:35 27

原创 【Mybatis】一级、二级缓存机制

一级缓存一级缓存配置我们来看看如何使用MyBatis一级缓存。开发者只需在MyBatis的配置文件中,添加如下语句,就可以使用一级缓存。共有两个选项,SESSION或者STATEMENT,默认是SESSION级别,即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。一种是STATEMENT级别,可以理解为缓存只对当前执行的这一个Statement有效。<setting name="localCacheScope" value="SESSION"/>一级缓存实验接下来通过实

2021-02-27 20:10:58 16

原创 【Mybatis】动态 SQL 源码解析

动态SQL解析原理我们在使用mybatis的时候,会在xml中编写sql语句。比如这段动态sql代码:<update id="update" parameterType="org.format.dynamicproxy.mybatis.bean.User"> UPDATE users <trim prefix="SET" prefixOverrides=","> <if test="name != null and name != ''"&g

2021-02-27 20:10:12 26

原创 【Mybatis】动态 SQL 特性

动态SQL使用动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可

2021-02-27 20:03:51 8

原创 【Mybatis】Mapper 注册与绑定源码解析

ybatis源码分析之Mapper注册与绑定​我们都知道 Mapper 是一个接口,它的每个方式是我们与数据库交互的入口,每个 Mapper 都有与之相对应的一个 XML 文件,我们可以在 XML 里面自由快活地写 sql,当然我们也可以用注解的形式写在接口方法上,但终究还是没 XML 灵活,那么问题来了,Mybatis 是如何注册与绑定 Mapper 的呢?下面我带你揭开这个神秘的面纱。首先我们来看看用 Mybatis 执行 sql 的两种方法直接操作 SqlSession 方法publ

2021-02-26 23:56:45 53

原创 【MyBatis】执行原理(四):MapperProxy执行SQL源码分析

通过前三篇的分析,我们已经了解了 SqlSessionFactory,SqlSession,MapperProxy 底层的逻辑【MyBatis】执行原理(一):创建会话工厂(SqlSessionFactory) --配置解析源码分析【MyBatis】执行原理(二):创建会话(SqlSession) 源码分析【MyBatis】执行原理(三):获取代理对象(MapperProxy) 源码分析String resource = "mybatis-config.xml"; InputStream in

2021-02-26 23:51:36 22

原创 【MyBatis】执行原理(三):获取代理对象(MapperProxy) 源码分析

通过前两篇的分析,我们已经了解了 SqlSessionFactory,SqlSession 底层的逻辑【MyBatis】执行原理(一):创建会话工厂(SqlSessionFactory) --配置解析源码分析【MyBatis】执行原理(二):创建会话(SqlSession) 源码分析String resource = "mybatis-config.xml"; InputStream inputStream = Resources. getResourceAsStream(resource);

2021-02-26 23:50:35 14

原创 【MyBatis】执行原理(二):创建会话(SqlSession) 源码分析

在上一篇 【MyBatis】执行原理:创建会话工厂–配置解析源码分析 我们已经分析了创建 SqlSessionFactory 的源码,最终得到了一个 DefaultSqlSessionFactory。String resource = "mybatis-config.xml"; InputStream inputStream = Resources. getResourceAsStream(resource); // build 方法最终返回了 SqlSessionFactory 接口的默认实现 De

2021-02-26 23:49:56 11

原创 【MyBatis】执行原理(一):创建会话工厂(SqlSessionFactory) 源码分析

要分析 mybatis 的执行原理,首先要搞清楚的就是它如何解析配置文件的。PS:配置文件其实有两种,一个是由许多标签构成的mybatis-config.xml全局配置文件,另一个是可能有多个的Mapper.xml文件。本篇我们只看全局配置文件是如何解析的。在【MyBatis】基本使用(一):编程式使用(单用)及核心对象生命周期 我们说了如何使用 mybatisString resource = "mybatis-config.xml"; InputStream inputStream = Re

2021-02-26 23:49:24 50

原创 【MyBatis】配置文件 mybatis-conf.xml 详解

在上一篇 【Mybatis】编程式使用(单用)及核心对象声明周期 我们说了使用 mybatis,但是还有一个问题解决,就是 MyBatis 的配置文件到底能配什么?怎么配?本篇我们就一起来看看。大部分时候我们只需要很少的配置就可以让 MyBatis 运行起来。其实 MyBatis 里面提供的配置项非常多,我们没有配置的时候使用的是系统的默认值。mybatis源码地址…下面是一个 mybatis-conf.xml 示例,包括了我们下来要说的的标签<?xml version="1.0" en

2021-02-26 23:48:20 44

原创 【MyBatis】编程式流程及核心对象生命周期

大部分时候,我们都是在Spring里面去集成MyBatis。因为Spring对MyBatis的一些操作进行的封装,我们不能直接看到它的本质,所以先看下不使用容器的时候,也就是编程的方式,MyBatis怎么使用依赖:导入 mybatis 的 jar包。配置文件:全局配置文件,这里面是对 MyBatis 的核心行为的控制。我们常命名为 mybatis-config.xml。放个参考链接 【Mybatis】配置文件 mybatis-conf.xml 详解…映射器文件:通常来说一张表对应一个

2021-02-26 23:47:42 18

原创 【MyBatis】架构分层及主要对象

在 MyBatis 的主要工作流程里面,不同的功能是由很多不同的类协作完成的,它们分布在 MyBatis jar 包的不同的 package 里面。我们来看一下 MyBatis 的jar包(基于3.4.6),jar包结构是这样的(21个包):跟Spring一样,MyBatis 按照功能职责的不同,所有的 package 可以分成不同的工作层次1.接口层第一个是跟客户打交道的服务员,它是用来接收程序的工作指令的,我们把它叫做接口层。接口层是我们打交道最多的。核心对象是 SqlSession,它是上

2021-02-26 23:46:00 12

原创 操作数据库的三种选择

1.原生JDBC在Java程序里面去连接数据库,最原始的办法是使用JDBC的API。我们先来回顾一下使用JDBC的方式,我们是怎么操作数据库的// 1.注册 JDBC 驱动 Class. forName ("com.mysql.jdbc.Driver");// 2.打开连接 conn = DriverManager. getConnection ( DB _ URL ,USER ,PASSWORD );// 3.获取执行器statementstmt = conn.createStatement

2021-02-26 23:37:55 20

原创 仿写简易框架 Spring(五)实现 AOP(类似 aop 包)

在前面两篇,我们已经成功实现了 Spring 最核心的功能 IOC和DI 以及 MVC:【Spring】重构–手写Spring核心逻辑(二)实现IOC/DI(beans包)【Spring】重构–手写Spring核心逻辑(三)实现IOC/DI(context包)【Spring】重构–手写Spring核心逻辑(四)实现MVC(webmvc包)从这篇开始,我们就要来实现Spring的另一核心 AOP。1.配置封装(config包)下面这些类 AOP 中需要用到的基本组件,是对一些基本信息的封装。

2021-02-26 00:00:04 29 1

原创 仿写简易框架 Spring(四)实现 MVC(类似 webmvc 包)

在前面两篇,我们已经成功实现了 Spring 最核心的功能 IOC和DI:【Spring】重构–手写Spring核心逻辑(二)实现IOC/DI(beans包)【Spring】重构–手写Spring核心逻辑(三)实现IOC/DI(context包)从这篇开始,我们来看看如何实现 MVC:MVC 的核心就是那九大组件 【Spring】MVC:九大核心组件分析,而其中最重要的三个:HandlerMappings,HandlerAdapters,ViewResolvers。1.MYHandlerMa

2021-02-25 23:59:31 21

原创 仿写简易框架 Spring(三)实现 IOC/DI(类似 context 包)

在上一篇 【Spring】重构–手写Spring核心逻辑(二)实现IOC/DI(beans包) 我们已经实现了 beans 包中的相关类,本篇就来实现 context 中关于容器的具体逻辑。1.MYAbstractApplicationContextIOC容器顶层设计,是最顶层容器的规范,不管是 XmlApplication 还是 AnnotationApplication 都必须去实现。这种设计也便于我们日后扩展新容器。public abstract class MYAbstractApplica

2021-02-25 23:59:00 11

原创 仿写简易框架 Spring(二)实现 IOC/DI(类似 beans 包)

在上篇 【Spring】重构–手写Spring核心逻辑(一)目标及框架结构 我们介绍了手写框架的项目结构,这篇我们就从IOC/DI开始,先完成 beans 包的内容。beans 包中一般放的是配置、规范、标准等,关于 IOC 容器的具体逻辑实现是在 context 包中。1.MYBeanFactoryBeanFactory是顶层设计,相当于规范了IOC容器的功能。public interface MYBeanFactory { // 通过beanName获取bean Object get

2021-02-25 23:58:30 34

原创 仿写简易框架 Spring(一)目标及框架结构

之前我们用300行代码手写过 Spring 核心逻辑 【Spring】手写Spring核心逻辑–实现IOC、DI、MVC,虽然也达到了我们想要的目的,实现了Spring的最基本功能,但是它把所有功能都放在一个类(MYDispatchServlet)中,没有用到任何设计模式。另外,它也没有实现Spring另一核心 aop 相关逻辑。所以,本篇我们就开始对它进行重构与扩充,原则是尽量模仿着Spring原本的样子,达到高仿真的目的。1.要实现的目标跟上篇一样,我们还是先来明确一下要实现的目标:目标一:I

2021-02-25 23:58:00 46

原创 【Spring】MVC:HandlerAdapter 适配与执行的过程

前言三个核心接口HttpMessageConverterSpringMVC处理请求和响应时,支持多种类型的请求参数和返回类型,而此种功能的实现就需要对HTTP消息体和参数及返回值进行转换,为此SpringMVC提供了大量的转换类,所有转换类都实现了HttpMessageConverter接口。HttpMessageConverter接口定义了5个方法,用于将HTTP请求报文转换为java对象,以及将java对象转换为HTTP响应报文。对应到SpringMVC的Controller方法,read方法

2021-02-23 00:01:25 155 1

原创 【Spring】MVC:HandlerInterceptor 注册与时序原理

前言HandlerInterceptor 定义public interface HandlerInterceptor { /** * 预处理回调方法,实现处理器的预处理,第三个参数为响应的处理器,自定义Controller * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断 * 不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应 */ default boolean preHandle

2021-02-23 00:01:07 79 2

原创 【Spring】MVC:HandlerMapping 初始化及 handler 获取

一、请求的分发过程首先简单描述一下,请求的分发过程。一个请求到来,会走到DispatcherServlet的doDispatch方法。这个方法非常重要,封装了整个请求的分发过程,其中有一段代码如下://根据请求找到对应的handler mappedHandler = getHandler(processedRequest, false);if (mappedHandler == null || mappedHandler.getHandler() == null) { noHand

2021-02-23 00:00:58 68

原创 【Spring】MVC:源码流程(下)运行阶段

运行源码流程时序图DispatchServletdoDispatch()// 中央控制器,控制请求的转发 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = n

2021-02-23 00:00:43 59 1

原创 【Spring】MVC:源码流程(中)Servlet 初始化阶段

初始化运行时序图如下(只列出了核心类和方法):Servlet 的继承关系流程下面进入正文,我们的思路是首先找到 DispatcherServlet 这个类,然后寻找init()方法。我们发现其 init 方法其实在父类 HttpServletBean中,源码如下:init()@Overridepublic final void init() throws ServletException { if (logger.isDebugEnabled()) { logger.de

2021-02-23 00:00:33 70 1

原创 【Spring】MVC:源码流程(上)从监听器启动

Spring MVC启动过程web.xml 配置接下来以一个常见的简单web.xml配置进行Spring MVC启动过程的分析,web.xml配置内容如下:<web-app> <display-name>Web Application</display-name> <!--全局变量配置--> <context-param> <param-name>contextConfigLocation</para

2021-02-23 00:00:22 56

原创 【Spring】MVC:九大核心组件分析

SpringMVC相对于前面的IOC、DI、AOP是比较简单的,Spring MVC的核心组件和大致处理流程如下图:DispatcherServlet是SpringMVC中的前端控制器(FrontController),负责接收Request并将Request转发给对应的处理组件。HanlerMapping 是 SpringMVC 中 完 成 url 到 Controller 映 射 的 组 件 。DispatcherServlet 接收 Request,然后从 HandlerMapping 查找处

2021-02-23 00:00:12 66

原创 【Spring】SpringMVC 整合示例与优化建议

1.web.xml中添加spring相关配置在web.xml中需要配置spring上下文监听器和springmvc的servlet,并且指定spring上下文配置文件和springmvc配置文件,具体配置如下:<!--spring监听器,指定spring配置文件--><context-param> <param-name>contextConfigLocation</param-name> <param-value>class

2021-02-23 00:00:00 61

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除