自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

迦南学院

生活不可能像你想象的那么美好,但也不会像你想象的那么糟糕。

  • 博客(115)
  • 收藏
  • 关注

原创 《JSR303参数校验》

业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。例如性别参数只能是0或者1,某个字段必须是{“aa”,“bb”,"cc}中的一个【自定义注解】// 这里需要注意标明校验类String message() default "数据错误";Class

2024-01-03 22:05:49 1040

原创 《SpringBoot》第05章 配置文件解析

触发监听器,来启动配置文件的加载。SpringBoot只是采用的监听器的方式,如果直接代码调用也可以。在监听器中,遍历解析各个配置文件,将解析到的配置存入中。

2023-07-06 22:39:58 669

原创 《Spring系列》第18章 监听器Listener

何为监听器?就是用来监听程序执行的。监听器可以做什么事?可以监听程序执行,使程序在不同的阶段做不同的事情,并且与程序主业务逻辑解耦。那么读者读完是否很迷茫?如果学过MQ的可以把想象成一种订阅-发布模式,监听器首先订阅事件,然后其它功能主动发布事件,已触发监听器订阅的事件。举个例子:最常见的购物逻辑中,下订单以后就要扣库存,可以理解为扣库存这个操作监听了订单,这就是一种监听器,当下了订单,此时触发监听器,执行扣库存操作。有没有觉得监听器更像是订阅-发布模式。

2023-07-06 22:32:58 817

原创 《SpringBoot》第04章 个性化定制

Component。

2023-03-30 09:46:51 324

原创 《SpringBoot》第03章 自动配置机制(二) 根注解@SpringBootApplication

将启动类标注为,毕竟只有被标记为配置类,才能被扫描进IOC容器: 自动配置机制,包括:引入自动配置包 + 扫描自动配置机制用到的类:扫描bean,默认会扫描启动类同级包和子包下开发人员写的bean。

2023-03-30 09:45:56 701

原创 《SpringBoot》第02章 自动配置机制(一) 项目启动

当启动SpringBoot的时候,需要运行主程序的main()方法,那么代码执行的时候首先会创建一个对象,然后进行一些初始化工作,那么就先介绍初始化了哪些东西关于判断应用类型初始化各种底层类,包括:初始化器、监听器获取主启动类,主启动类很关键,后续会详细讲到在上面我们把创建完毕了,并且初始化了一些组件,那么接下来就来看一下run()那么首先需要明确一点的就是SpringBoot底层封装的最核心的框架依旧是Spring框架,那么SpringBoot利用了Spring。

2023-03-30 09:38:09 459

原创 《SpringBoot》第01章 基础使用

自定义横幅可以设置文字或者图像可以通过将banner.txt文件添加到类路径或将属性设置为此类文件的位置来更改启动时打印的横幅。可以添加一个banner.gifbanner.jpg或banner.png图像文件到类路径或设置属性。图像被转换为 ASCII 艺术表现形式并打印在任何文本横幅上方如果文件的编码不是 UTF-8,您可以设置测试的时候,发现如果文字和图像同时配置了,则图像的优先级更高banner.txt文件中,可以使用以下占位符占位符描述应用程序的版本号,如. 例如,打印为1.0。

2023-03-30 09:06:49 296

原创 《Spring系列》第17章 后置处理器PostProcessor

Spring框架是一个非常优秀的框架,是Java程序员必须会的技术,其提供了非常良好的扩展性能,那么更多的是依赖其提供的后置处理器性能这些后置处理器按照对象主要分为两类,分别针对和Bean,然后存在各种类型。

2023-03-30 08:55:19 449

原创 《Spring系列》第16章 声明式事务(二) 源码解读

当我们通过注解开启声明式事务,使用步骤非常简单,那么来介绍一下底层原理。

2023-03-30 08:51:38 319

原创 《Spring系列》第15章 声明式事务(一) 基础使用

Transactional,这个注解添加到类上面,也可以添加方法上面如果把这个注解添加类上面,这个类里面所有的方法都添加事务如果把这个注解添加方法上面,为这个方法添加事务看一下其源码@Target({// 事务传播行为 Propagation propagation() default Propagation . REQUIRED;// 事务的隔离级别 Isolation isolation() default Isolation . DEFAULT;

2023-03-30 08:48:08 392

原创 《Spring系列》第14章 Aop切面(三) 链式执行

在前一篇文章中介绍了Aop的代理创建,那么当执行的时候,如何执行的呢?在这里Spring框架采用的是链式执行,这也对应Aop的设置规则,按照固定的顺序取执行。

2023-03-30 08:45:38 327

原创 《Spring系列》第13章 Aop切面(二) 代理创建

通过上面的内容得知,注解最终会向Bean的定义信息里面注册一个类,其对应的beanName为通过下面的类图可以看出,实现了,证明它是一个后置处理器,不仅需要把它注入到IOC容器中,还需要把它注入到后置处理器集合中上面已经获取到了其增强器,然后继续回到,接下来就是开始创建代理了,那么在看源码之前先把代理的知识聊一下如果忘了最基础的如何创建代理请阅读《GoF设计模式》 之No.11代理模式》注意:此处这里指的是Spring提供的应用层得方式,并不是指的底层实现方式。

2023-03-30 08:36:39 404

原创 《Spring系列》第12章 Aop切面(一) 基础使用

AOP:Aspect Oriented Programming,中文翻译为”面向切面编程“。面向切面编程是一种编程范式,它作为OOP面向对象编程的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、权限控制、缓存控制、日志打印等等。AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码。

2023-03-29 23:02:12 115

原创 《Spring系列》第11章 别名机制

在 spring 容器中,允许通过名称或别名来获取 bean ,这个能力来自于顶层接口,分析类下属的关系图,可以看到,几乎所有主要容器都直接或间接的实现了接口。的结构非常简单,主要的类就是接口与他的实现类,后续的实现类基本都直接或间接的继承了。

2023-03-29 22:59:05 723

原创 《Spring系列》第10章 循环依赖

简单点说,就是A依赖了B,B依赖的A,也可能是C依赖C,那么在Spring框架初始化的时候,如果不处理这种情况,就会产生问题的。// A依赖了B,B是A对象中的一个属性 @Component class A {} // B依赖了A @Component class B {上面介绍了三级缓存的出现原因,那么接下来具体看一下三级缓存的源码。

2023-03-29 22:57:41 310

原创 《Spring系列》第9章 Bean的加载(二) createBean()

客户定制的初始化方法除了我们使用的配置外,还有使自定义的bean实现接口,并在初始化业务逻辑// 1.检查该bean是否实现了InitializingBean接口 boolean isInitializingBean =(bean instanceof InitializingBean);= null) {try {} } else {// 调用其自定义的初始化方法((InitializingBean) bean) . afterPropertiesSet();

2023-03-29 22:48:23 571

原创 《Spring系列》第8章 Bean的加载(一) getBean()

当获取Bean对象的时候,会通过接口提供的getBean()来获取,这个方法在子类得到了实现,getBean是创建Bean的入口,具体实现需要,那么接下来就来看一下源码。

2023-03-29 08:55:12 511

原创 《Spring系列》第7章 BeanDefinition

继承自:Spring框架内部使用的,其他BeanDefinition都会转换为它:编程定义使用的,官方推荐使用:父子bean的时候使用,已逐步废弃:写在中的@Bean,会被注册成该BeanDefinition:通过注解方式引入的Bean,最常见的是@Import引入:通过扫描方式引入的Bean,那就是当定义父子bean的时候,那么上面的可以作为一个普通的,也可以作为父bean,但是不能定义为子bean,那么这个时候就需要,而且不可以单独存在,必须要依赖一个父BeanDetintiont。

2023-03-28 15:36:52 708

原创 《Spring系列》第6章 @Configuration

Spring框架解析@Configuration配置类【源码解析】

2023-03-28 13:38:03 425

原创 《Spring系列》第5章 refresh()

Spring框架刷新容器核心方法refresh()【源码解读】

2023-03-28 13:36:43 538

原创 《Spring系列》第4章 依赖注入的六种方式

​是为IOC容器中的Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上,给Bean的实现加上了一个简单工厂模式和装饰模式。​ 一般情况下实例化一个Bean对象:Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。为此Spring提供了该接口,用户可以通过实现该接口,然后在。

2023-03-27 21:42:48 764

原创 《Spring系列》第3章 基于注解管理Bean

1)创建类实现TypeFilter接口。

2023-03-27 21:41:37 743

原创 《Spring系列》第2章 解析XML获取Bean

是一个接口,它描述了一个 Bean 实例的定义,包括属性值、构造方法值和继承自它的类的更多信息。// 其中方法就不粘贴了,太多了 }解析默认标签。解析默认标签后下得自定义标签。注册解析后的 BeanDefinition。// 如果解析成功,则返回 BeanDefinitionHolder 对象。而 BeanDefinitionHolder 为 name 和 alias 的 BeanDefinition 对象 // 如果解析失败,则返回 null。= null) {

2023-03-27 21:30:13 1055

原创 《Spring系列》第1章 基于XML管理Bean

abstract:设置bean是否为抽象类,默认为false。如果为true,则该bean不会被实例化。那不被实例化,还定义它有啥用呢?这就要讲parent属性了。parent:bean标签中的parent属性和java中的继承有些类似,但又不一样。parent属性可以指定一个类。那么bean和parent指定的类可以是继承关系,也可以不是继承关系。只要指定了parent,那么parent类中的属性名,就可以自动继承到bean类中了。当然bean也可以对parent的属性进行覆盖。同时可以扩展其他的属性。

2023-03-27 21:27:19 902

原创 《SpringMVC系列》第八章:文件上传

一、文件上传1.测试表单<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="提交"></form>接口 @ResponseBody @PostMapping(value = "/upload")

2022-05-10 23:34:59 518

原创 《SpringMVC系列》第七章:拦截器

一、拦截器HandlerInterceptor接口拦截器接口提供了3个方法public interface HandlerInterceptor { // 方法执行前 default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } // 方法执行后 def

2022-05-10 23:34:01 385

原创 《SpringMVC系列》第六章:异常处理

划重点异常处理自动配置类为ErrorMvcAutoConfiguration异常信息保存在DefaultErrorAttributes中异常捕获在我们最熟悉的doDispatch()方法异常处理首先会遍历处理异常解析器,判断是否自定义了异常处理,也就是@ExceptionHandler、ResponseStatus等,这样我们不仅可以自定义异常处理逻辑,而且可以设定返回结果当没有自定义异常处理类,则会默认请求/error,该请求会跳转到自动配置类里面注册的BasicErrorController

2022-05-10 23:32:35 788 2

原创 《SpringMVC系列》第五章:视图解析

重点当目标方法返回是页面重定向时,如何处理当目标方法返回是请求转发是,代码如何处理四、处理页面重定向redirect上一章我们介绍了经过当响应体经过@ResponseBody修饰,返回结果为JSON时是如何处理的,那么当我们的请求返回的是一个重定向,那么这个是如何处理的@Controllerpublic class WebController { @GetMapping(value = "/index1") public String index1(User user,

2022-05-10 23:30:31 197

原创 《SpringMVC系列》第四章:响应处理

一、响应处理流程a) invokeAndHandle()通过SpringMVC处理请求时,肯定会经过doDispatch()方法,获取到HandlerMapping,然后找到HandlerAdapter,调用目标方法,底层会调用到这个方法,前面的过程之前已经介绍过了 public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs

2022-05-10 23:28:29 653

原创 《SpringMVC系列》第三章:请求处理

重点:Controller层支持的各种注解以及负责处理这个注解参数解析器Servert Api 默认注入的参数参数是如何自动绑定的,包括单个参数和对象参数一、参数解析器1.方法参数处理解析器在SpringMVC中请求调用目标方法需要处理参数,那么不同的参数肯定处理方式不同,SpringMVC提供了一个接口HandlerMethodArgumentResolver,然后多个子类重写,用于处理不同的参数这个接口提供了两个方法,也很好理解,第1个判断是否为该类型的参数,第2个负责接续publi

2022-05-10 23:19:24 583

原创 《Collection系列》第三集:ConcurrentHashMap

1.基础介绍在日常开发中使用的 HashMap 是线程不安全的,而线程安全类 HashTable 只是简单的在方法上加锁实现了线程安全,效率低下,所以在线程安全的环境下我们通常会使用 ConcurrentHashMappackage java.util.concurrent;public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>,

2022-05-10 21:32:29 198

原创 《Collection系列》第一集:HashSet

HashSet类关系public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{}主要参数 // 底层通过HashMap来实现 private transient HashMap<E,Object> map; // Dummy value to associate with an Ob

2022-05-06 22:52:28 209

原创 《Collection系列》第二集:LinkedHashMap

1.继承HashMapLinkedHashMap继承自HashMap,它的多种操作都是建立在HashMap操作的基础上的。同HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序。这也是Linked的含义。结构图如下 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {}2.Entry继承了HashMap的N

2022-05-06 21:55:52 273

原创 《Docker》高级篇

一、DockerFile1.概述DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本1)镜像构建三步骤213编写Dockerfile文件docker build命令构建镜像docker run 镜像运行容器实例2)DockerFile基础知识每条保留字指令都必须为大写字母且后面要跟随至少一个参数指令按照从上到下,顺序执行#表示注释每条指令都会创建一个新的镜像层并对镜像进行提交3)DockerFile执行大概流程doc

2022-04-10 18:02:59 1395 1

原创 《Docker》基础篇

一、Docker简介1.官网Docker官网: https://www.docker.com/Docker文档地址:https://docs.docker.com/Docker仓库地址:https://hub.docker.com/2.传统虚拟机和容器的对比传统虚拟机包含一整套完整的计算机结构,而容器则只保存必要的环境,保证最小的轻量化(1)docker有着比虚拟机更少的抽象层由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是

2022-04-10 02:39:23 2973

原创 《Redis系列》第九章:Redis6新特征

一、订阅与发布1.服务器工作服务器中维护着一个pubsub_channels字典,所有的频道和订阅关系都存储在这里。字典的键为频道的名称,而值为订阅频道的客户端链表。当有新的客户端订阅某个频道时,会发生两种情况中的一种:1)如果频道已经存在,则新的客户端会添加到pubsub_channels对应频道的链表末尾2)如果频道原本不存在,则会为频道创建一个键,该客户端成为链表的第一个元素当一个客户端退订一个频道的时候:pubsub_channels对应键的链表会删除该客户端发送信息服

2022-02-22 22:08:02 592

原创 《Java基础》运算符

当两边操作数的位有一边为1时,结果为1,否则为0。当相同的位上均为1时结果为1,否则结 果为0。无符号左移 >两边的位不同时,结果为1,否则为0。将数字补码取反 1变0 0变1。负数进行无符号右移的时候前面补0。负数进行右移的时候,前面补1。左移>注意: 没有无符号左移。

2021-11-30 11:41:00 177

原创 《Mybatis源码》第20章 ErrorContext 全局异常信息

# ErrorContext 错误日志mybatis在读取mapper文件的时候,会存在下面这行代码,那么它用到了ErrorContext类,那么该类的作用是啥?ErrorContext.instance().resource(resource);MyBatis 还有一个很有意思的点在于异常日志的输出。不知道大家有没有发现,使用 MyBatis 时定位问题非常容易,我们只需要查看一下控制台的异常日志就能一目了然地知道问题出现在了哪里。就像这样:1.存储异常信息的字段MyBatis 异常涵盖的信

2021-11-25 23:37:54 845 3

原创 《Mybatis源码》第19章 parsing解析

介绍一下org.apache.ibatis.parsing包下面负责解析的类TokenHandler 令牌处理public interface TokenHandler { // 处理令牌 并且返回处理结果 String handleToken(String content);}GenericTokenParser通用的令牌解析,该类的主要作用就是将被openToken 和 closeToken包含的内容,替换成TokenHandler返回的内容例如: 将 #{} 替换成 ?

2021-11-25 23:37:16 188

原创 《Mybatis源码》第18章 plugin插件

一、源码分析InterceptorChain 拦截器链XMLConfigBuilder会将解析mybatis-config.xml插件的结果存储到该类中,也就是字段interceptors里面SqlSession四大组件会通过pluginAll()注册拦截器public class InterceptorChain { // 自定义拦截器集合 这里面包含的是我们在mybatis-config里面定义的插件 private final List<Interceptor>

2021-11-25 23:36:43 536

空空如也

空空如也

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

TA关注的人

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