自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 资源 (1)
  • 收藏
  • 关注

原创 MyBatis ObjectWrapper

MyBatais ObjectWrapper

2021-06-03 14:00:45 423 1

原创 Mybatis Invoker

Mybatis中的Invoker对反射API中的Field.get () Fielid.get()Method.invoke()三个方法进行了二次封装,将一些模板式的代码进行了封装,在新的版本中,还加入了安全检查。其结构如下:接口定义:/** * @author Clinton Begin */public interface Invoker { Object invoke(Object target, Object[] args) throws IllegalAccessE..

2021-05-19 18:16:52 245 1

原创 Mybatis PropertyTokenizer

PropertyTokenizer,比较常见的中文叫法是属性分词器,顾名思义,就是用来将属性表达式解析为Bean的字段。其主要功能有两个,1.将目标表达式一 一 解析为目标对象的字段名。2.对于有List|Array类型的表达式,PropertyTokenizer不但会把其属性名解析出来,还会将下标|key解析出来,有了下标|key,我们就可以操作指定下标|key的集合|map属性。属性表达式我把它分为两类,一般表达式和嵌套表达式一般表达式:只有一个属性构成,e.g:companyName.

2021-05-19 17:09:35 1171 1

原创 MyBatis MetaObject

1.操作Bean的字段Bean:public class ShouldGetAndSetField { /** * 无getter/setter 叫字段 * 有getter/setter 叫属性 * 假设我们现在要操作一个私有字段 * */ private String simpleField;}Test Case: @Test @DisplayName("get/set目标对象的私有字段值") void shouldGetAnd...

2021-05-13 18:43:14 541 2

原创 Mybatis Configuration

Configuration类是mybatis核心配置类,无论是全局配置文件还是mapping配置文件亦或是注解,所有的配置最终都会维护Configuration中,所以解读Configuration类,是学习mybatis的重中之重。本文不会和其他博客一样列出xml配置文件,然后在每一个属性上标上注释,而是采取在源码上编写注释来达到学习的目的,一来,这样更加直观,记忆更深刻。二来,去XML配置化,全面拥抱注解是已经成为当今主流的开发方式,因此本人侧重点也是注解,而非xml。除了把mybatis官网上

2021-04-28 14:51:45 703

原创 Mybatis 源码编译

本次构建基于github mybaits3 maven 当前最新版本。该项目包含两个project,即parent-master(33-SNAPSHOT)和mybatis-master(3.3.0-SNAPSHOT),IDE使用Intellij 2020.3社区版,parent-master下载链接:https://github.com/mybatis/parent,mybatis-master下载链接:https://github.com/mybatis/mybatis-3。由于环境限制,本次源码码.

2021-04-27 11:42:01 816

原创 Spring5:就这一次,搞定资源加载器之资源抽象接口Resource

在日常的程序开发的过程中,咱们经常要做的一件事就是加载资源。JDK为我们提供了File,URL等类供咱们使用。然而,在java程序中,资源的存放位置是各异的,有的存放在classpath中,有的存放在文件系统中,有的存放在web应用中。而对于不同位置的资源,java程序获取这些资源的方法各有不同。 对于classpath:咱们通常使用类加载器加载资源文件,例如:Class.getResource(...

2018-07-09 17:47:12 409

原创 Spring5:就这一次,搞定资源加载器之AbstractApplicationContext

下面咱们来介绍DefaultResourceLoader的最后一个孩子:AbstractApplicationContext。AbstractApplicationContext是Spring容器最重要的一个类,这个抽象类中提供了几乎ApplicationContext的所有操作。AbstractApplicationContext虽然继承自DefaultResourceLoader,但是Abst...

2018-07-06 14:25:56 598

原创 Spring5:就这一次,搞定资源加载器之ServletContextResourceLoader

ServletContextResourceLoader继承自DefaultReourceLoader,并重写了getResourceByPath(String path)方法,该类的扩展功能是可以从Servlet上下文的根目录加载资源。构造该加载器的时候需要ServletContext,示例如下:@Controllerpublic class LoginController { ...

2018-07-06 11:59:03 644

原创 Spring5:就这一次,搞定资源加载器之FileSystemResourceLoader

FileSystemResourceLoader继承自DefaultResourceLoader,并重写了getResourceByPath(String path)方法,返回FileSystemContextResource类型资源,源码如下:/* * Copyright 2002-2017 the original author or authors. * * Licensed unde...

2018-07-06 11:20:03 1282

原创 Spring5:就这一次,搞定资源加载器之ClassRelativeResourceLoader

ClassRelativeResourceLoader继承自DefaultResourceLoader,代码如下:/* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not ...

2018-07-05 11:46:12 3035

原创 Spring5:就这一次,搞定资源加载器之DefaultResourceLoader

Spring定义了一套资源加载接口,并提供了实现类,结构如下:顶级接口ResourceLoader仅提供了一个getResource(String location)方法,可以根据一个资源地址加载资源文件,不过,资源地址仅仅支持代资源类型前缀的表达式,不支持ant风格的资源路径表达式,例如: 以file为前缀的地址:"file:C:/test.dat"已classpath为前缀的地址:"class...

2018-07-04 16:32:27 3214

原创 Spring5:就这一次,搞定JDBC之异常转换器

1. JDBC API 异常处理 存在哪些痛点? 1.使用检查型异常        JDBC API 使用检查型异常,以至于开发者在使用时须强制捕捉这些异常。然而在多数的情况下,引发异常的原因往往是不可修复的 ,开发者除了能在try/catch记录异常信息外,并没有做多少实质性的工作。因此检查型异常除了限制开发者的自由外,并没有提供什么有价值的东西,实在是用也用不得,丢也丢不得。2.体系单一,语义...

2018-06-14 15:12:54 598

原创 Spring5:就这一次,搞定JDBC异常转换器之自定义异常转换器

在上一篇文章里面分析到,Spring JDBC异常转换器为开发者预留了接口

2018-06-14 15:03:48 6369

原创 Spring5:就这一次,搞定JDBC异常转换器之异常转换过程简析

假设调用以下方法 public <T> T execute(StatementCallback<T> action) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); Connection con = DataSourceUtils.ge...

2018-06-13 17:10:06 1671

原创 设计模式-建造者模式

定义:将复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建出不同的表示。建造者模式属于创建型模式适用场景1.多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。2.产品类非常复杂,或者产品类中的调用顺序同步产生不同的作用3.当初始哈一个对象特批复杂,参数多,而且很多参数都有默认值时。类图这是一种在Builder里面直接new对象的方式,MyBatis的SqlSessionFactoryBuilder就是这种写法,适用于属性之间关联不多且大量属性都有默认值

2021-07-05 23:11:37 127 1

原创 设计模式-策略模式

策略模式,又叫政策模式,他是将定义的算法家族,分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。可以避免多重分支的 if...else...和switch语句。策略模式属于行为型设计模式。策略模式也可以理解为是一种单一的we生活中的应用场景:阶梯个税,手机支付方式选择。应用场景1.假如系统中有很多类,而他们的区别仅仅在于它们的行为不同。2.需要动态的在几种算法中选择一种。3.需要屏蔽算法规则。类图:...

2021-07-05 22:55:36 130

原创 设计模式-委派模式

定义:委派模式又叫委托模式,它的主要职责是负责任务的调度和分配,将任务的执行和分配分离开来,可以看做是一种特殊情况下静态代理的全权代理。委派模式不属于GOF23中的设计模式,委派模式是行为型设计模式。委派模式的应用场景:1.委派对象本身不知道如何处理一个任务,或一个请求,把请求交给其他对象处理。2.实现程序的解耦。类图:java中的classloader 的双亲委派机制。java反射中的method.invoke()方法。spring中的BeanDefinitionParse

2021-07-05 17:28:17 154

原创 设计模式-代理模式

代理模式是一个非常常见的模式。定义:代理模式使指为其他对象提供一种代理,以控制这个对象的访问。代理对象在客户端和目标对象之间起中介作用。代理模式属于结构性设计模式。生活中的代理:房产中介,快递小哥,黄牛党。静态代理有两种形式,静态代理和动态代理静态代理:显示声明被代理对象。静态代理类图:JDK代理:利用字节码重组技术生成一个的新的类,该类继承自Proxy,并且会实现被代理对象的实现的所有接口的接口方法,并提供InvocationHandlerCGLIB代理:Spr

2021-07-04 16:52:27 94 1

原创 设计模式-桥接模式

定义:也成为桥梁模式、接口模式或柄体模式,是将抽象不服与它的具体实现部分分离,使它们都可以独立地变化。通过组合的方式建立两个类之间的联系,而不是继承。桥接模式属于结构型设计模式。桥接模式是继承或者多重继承的一种替代方法,因为多重继承违背了类的单一职责。桥梁模式的适用场景1.在抽象和具体之间需要增加更多的灵活场景。2.一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展。3.不希望适用继承,或因为多层继承导致系统类的个数剧增。桥接模式在生活中的场景:连接两个

2021-07-04 15:32:24 64

原创 设计模式-适配器模式

定义:适配器模式又叫做变压器模式,它的功能是将一个类的接口变成客户端期望的另一种接口,从而使原本因接口不匹配而导致无法一起工作的两个类能够一起工作。适配器模式属于结构型设计模式。生活中的适配器模式:两脚转三角插头,手机充电接口,显示器转接头适用场景1.已经存在的类,他的方法和需求不匹配(方法结果相同活相似)的情况2.适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护由于不同产品、不同厂家造成功 能类似而接口不相同情况下的解决方案。适配器可细分为三种,分别是类适配器,接口适配器.

2021-07-04 14:34:57 73

原创 设计模式-装饰器模式

定义:装饰器模式也叫包装模式,是指在不改变原来对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。装饰器模式属于结构型设计模式特点:透明的,动态的扩展原有对象的功能。生活中的装饰器模式:煎饼,水果蛋糕。适用场景:1.用于扩展一个类的功能或者给类添加一个附加职责。2.动态的给对象添加功能,这些功能可以再动态的撤销。类图:应用举例:jdk中的IO流,spring中的transaction.mybatis的cache.装饰器模式和代理模式

2021-07-04 09:39:45 87

原创 设计模式-单例模式

定义:确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。构造器私有化,阻止外部程序对其实例化。创建型设计模式适用场景:确保任何情况下都绝对只有一个实例。如ServletContext,ServletConfig,ApplicationContext,DBTool等。单例模式的常见写法:饿汉式单例 特点:类加载的时候就立即初始化, 优点:执行效率高,性能高, 缺点:在某些情况下可能会造成内存浪费。懒汉式单例 ...

2021-07-03 21:33:25 47

原创 设计模式-工厂模式

工厂历史的由来:原始社会自给自足->农耕社会小作坊(简单工厂)->工厂流水线生产->现代产业链代工厂简单工厂模式定义::是指有一个工厂对象决定创建出哪一种产品类的实例。创建过程封装到工厂内部,调用者无需关注。简单工厂不属于GOF23中的设计模式,属于创建型的设计模式。优点:减少代码的冗余,即创建对象的逻辑集中到对象工厂中统一维护,避免创建对象的动作存在于程序的各个角落,从而避免散弹式的bug。也可以减少业务对象的职责,使业务对象更加专注于业务本身。缺点:职责较重,每

2021-07-03 19:46:16 68

原创 设计模式-设计原则

1.开闭原则 (Open-Closed Principle)定义:一个软件实体如类,模块,函数应对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。开闭原则最核心的思想就是面向抽象编程。优点:提高软件系统的可复用性,可维护性和可测试性。2.依赖倒置原则定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。针对接口编程,不要针对实现编程。优点:可以减少类之间的耦合性、提高系统的稳定性,提高代码的可读性和可维护性,可以降低修改程序所造成的风险。.

2021-07-03 14:28:15 69

原创 Mybatis-Reflector

Mybatis是一个ORM(Object Relation Mapping)框架,既然是ORM框架,那么DB与POJO之间的相互映射必然是其重要工作之一。Reflector是对反射的二次封装。它更侧重于增强getter/setter方法。Reflector对Getter/Setter的增强主要围绕以下几点:1.缓存Class信息,提高效率。缓存class信息实际上并不是由Reflector本身来完成的,而是由ReflectorFactory接口负责,其接口定义如下:/** * 缓存Refle

2021-06-24 17:01:54 227

原创 Mybatis源码学习-reflection工具包一

reflection工具包mybatis3为简化反射操作,对java 反射API的二次封装,relection工具包是mybatis3 3层架构中的基础工具层,同时,mybaits声明周期中的所有new操作都有该包来完成,因此学习reflection能帮助我们了解mybatis3的执行原理,也可以在实际开发工作中单独使用该模块。反射工具包结构如下:其中,factory 负责所有mybatis声明周期相关对象的创建,其结构如下:factory包提供了一个接口和一个默认实现类,下面贴出根据个

2021-04-29 17:26:12 221

原创 Maven 仓库

1.什么是maven仓库1)maven世界中,任何一个项目的依赖、插件、或者项目输出,都可以称之为构件,每个构件都有唯一坐标供mave。2)每一个工作站上可能有几个或者十几个或者更多的maven项目,这些maven项目可能都依赖一些相同的构件,那么在每个项目中都拷贝一份相同的构件显然是不合理的,这样不仅会造成磁盘空间的浪费,还可能因为构件版本版本的差异造成一些不必要的麻烦。3)mave

2018-07-05 10:07:16 299

原创 100以内习题练习器

package com.zd.exercise.view.entrance;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import com.zd.exercise.controller.Exe...

2018-07-05 09:37:34 245

原创 Maven 继承

在项目的多个模块中,往往不同的模块会有相同的配置,比如,都同时依赖junit 构件 ,都连接到同一个私服,没错,这就是重复!重复往往意味着浪费更多的劳动力和存在一些潜在的问题,maven提供了继承的特性供我们解决这类问题 。假设现在一个项目有两个模块, helloMvnPersist、helloMvnService,两个模块都依赖的Junit构件,现在,我们要新建一个项目helloMvnParen

2018-07-05 09:36:41 1509

原创 Maven 聚合

应用场景:假设现有项目 helloMvn,该项目有2个模块,helloMvnService 和 helloMvnPersist需求:运行一次mvn命令,同时构建两个模块 。解决办法:利用mvn的聚合特性。操作:1.新建项目helloMvnAggregator,该项目仅仅需要包含pom.xml 就可以 ,helloMvnAggregator和helloMvnService 、helloMvnPers

2018-07-05 09:36:25 206

原创 第一个手工Maven项目,hello-world

1.手工构建Maven项目目录先创建项目主目录 helloworld, 在helloworld目录下创建pom.xml:xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0 com.mvn     hello-world       0.0.1

2018-07-05 09:36:05 279

原创 Maven 安装 (Windows)

1.安装之前请确保已安装JDK,并且配置 %JAVA_HOME%和%PATH%,可在cmd窗口用如下命令检查:2.下载地址:http://maven.apache.org/download.cgi。3.解压安装包到安装目录,配置环境变量%M2_HOME%指向安装目录,并将%M2_HOME%引用到%PATH%。4,检查,打开cmd ,在控制台输入 mvn -v  观察控制台是否输出MAVEN版本。5

2018-07-05 09:35:39 252

原创 Maven 依赖范围

1.什么是依赖范围?maven 项目不同的阶段引入到classpath中的依赖是不同的,例如,编译时,maven 会将与编译相关的依赖引入classpath中,测试时,maven会将测试相关的的依赖引入到classpath中,运行时,maven会将与运行相关的依赖引入classpath中,而依赖范围就是用来控制依赖于这三种classpath的关系。 2.依赖范围在pom.xml中如何体现? pom

2018-01-18 11:57:42 15485 4

100以内算数练习器

100以内算数练习器100以内算数练习器100以内算数练习器100以内算数练习器

2018-06-22

空空如也

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

TA关注的人

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