自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot 源码阅读(18):设计模式总结

设计模式在源码阅读过程中看到了各种设计模式,在此总结(这里不对各种设计模式多做介绍)。工厂模式工厂模式最典型的就是BeanFactory,通过bean名称我们可以获取bean实例,见博客。代理模式AOP的实现本质即使代理模式,通过JDK或CGLIB新建一个类代理原来的类,在保证原来类的功能的基础上进行增强。见博客。适配器模式在AOP源码中,我们看到通过适配器将没有实现MethodInterceptor接口的Advisor转换成方法拦截器,从而最后获取一条拦截链,即使用了适配器模式。见博客。观

2020-08-31 20:01:51 1046 1

原创 Java基础:JDBC连接过程

JDBC连接过程加载JDBC驱动 Class.forName(“com.mysql.jdbc.Driver”);建立连接Connection con = DriverManager.getConnection(“jdbc:mysql://localhost/sample”, username, password);创建语句对象Statement stmt = con.createStatement();执行SQL语句ResultSet rs = statement.ex

2020-08-31 16:59:12 200

原创 SpringBoot 源码阅读(17):AOP

AOPAOP自动配置如下:@Configuration@ConditionalOnClass({EnableAspectJAutoProxy.class, Aspect.class, Advice.class, AnnotatedElement.class})@ConditionalOnProperty( prefix = "spring.aop", name = {"auto"}, havingValue = "true", matchIfMissing = tru

2020-08-29 19:36:08 335

原创 SpringBoot 源码阅读(16):createBean

createBean@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { if (logger.isTraceEnabled()) { logger.trace("Creating instance of bean '" + beanName + "'"); } RootBea

2020-08-25 11:48:12 276

原创 JVM:内存模型

内存模型图片转自博客虚拟机栈首先从虚拟机栈开始,当我们创建一个新的线程,JVM就会新建一个虚拟机栈,因此虚拟机栈是线程隔离的。虚拟机栈每一层就是一层的方法调用,包含局部变量表、操作数栈、动态连接、方法出口等。当我们在方法中创建引用时,引用就会存储在局部变量表中,创建对象时,对象会创建在堆中,引用会指向堆中的对象。堆上一节说了,堆用于存储对象实例。图片转自博客。堆分为新生代,老年代,新生代又分为Eden区,survivo区,这样设计是为了垃圾回收。GC算法有三种基本算法:标记-清除算

2020-08-20 11:13:12 77

原创 SpringBoot 源码阅读(13):getBean

getBean通过getBean的源码可以了解Spring Bean的加载过程AbstractApplicationContext:@Overridepublic Object getBean(String name) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(name);}AbstractBeanFactory:@Overridepublic Object ge

2020-08-10 11:03:00 267

原创 SpringBoot 源码阅读(15):PostProcessor

PostProcessor后处理器是Spring功能扩展很重要的一部分,在源码中很多地方都可以见到,在此做下总结。BeanFactoryPostProcessor应用于刷新上下文时对BeanFactory的扩展可细分为BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor。@FunctionalInterf

2020-08-08 12:03:51 235 1

原创 闲杂笔记:IDEA生成UML类图

选中要生成类图的类的文件,按Ctrl+Alt+U即可,很好用。

2020-08-07 15:56:11 213

原创 SpringBoot 源码阅读(14):FactoryBean与BeanFactory

FactoryBeanFactoryBean为Spring提供的一个接口。直接尝试获取该类的实例并不会直接获取该类的实例,而是获得通过getObject获得的对象,即加工后的对象,该实例为一个工厂。想获得该工厂的实例,需要在bean名称前加前缀“&”。public interface FactoryBean<T> { @Nullable T getObject() throws Exception; @Nullable Class<?> getObject

2020-08-07 15:42:24 449

原创 SpringBoot 源码阅读(10):AutoConfigurationImportSelector(自动配置)

AutoConfigurationImportSelectorpublic class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { …………}该类为通过注解@EnableAutoConfiguration引入的类(见博客),

2020-08-07 11:20:31 389 1

原创 SpringBoot 源码阅读(9):ConfigurationClassPostProcessor与@ComponentScan、@Import

ConfigurationClassPostProcessor现在看下Spring Boot如何解析两个注解:@EnableAutoConfiguration@ComponentScanMainApplication是一个配置类(@SpringBootConfiguration),那么不妨猜测是在解析配置类时对这两个注解进行的解析,相关的类为ConfigurationClassPostProcessor。注册在AnnotationConfigServletWebServerApplication

2020-08-03 10:21:46 194

原创 SpringBoot 源码阅读(8):refreshContext

refreshContextprivate void refreshContext(ConfigurableApplicationContext context) { refresh(context); if (this.registerShutdownHook) { try { context.registerShutdownHook(); } catch (AccessControlException ex) { // Not allowed in some environ

2020-07-30 11:39:45 299 1

原创 SpringBoot 源码阅读(12):@Conditional

@Conditional条件注解:@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Conditional { /** * All {@link Condition Conditions} that must {@linkplain Condition#matches match} * in order for th

2020-07-27 22:29:35 75

原创 SpringBoot 源码阅读(11):@Component(@Configuration @Service @Repository @Controller)

@Component该注解代表该类为Spring的组件:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Indexedpublic @interface Component { /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean i

2020-07-27 21:30:00 147

原创 SpringBoot 源码阅读(5):@ComponentScan

@ComponentScan@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })@Retention(RetentionPolicy.RUNTIME)@Target(Ele

2020-07-27 11:22:23 226

原创 SpringBoot 源码阅读(4):@EnableAutoConfiguration

@EnableAutoConfiguration该注解用于自动配置,而自动配置是大部分人使用SpringBoot开发的主要原因。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConf

2020-07-27 11:17:32 274

原创 JDK源码阅读(10):String

Stringversion:1.8public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; ……}String:本质为不可变的字符数组,该类为final类,不可被继承。public String(String original) { this.value = original

2020-07-23 11:31:44 85

原创 SpringBoot 源码阅读(7):prepareContext

prepareContextprivate void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { //设置环境 context.setE

2020-07-22 11:33:37 127

原创 SpringBoot 源码阅读(6):createApplicationContext

createApplicationContext默认启动创建应用上下文AnnotationConfigServletWebServerApplicationContext:protected ConfigurableApplicationContext createApplicationContext() { Class<?> contextClass = this.applicationContextClass; //根据web应用类型寻找相应上下文的Class if (cont

2020-07-22 10:37:27 274

原创 SpringBoot 源码阅读(1):启动

@SpringBootApplication首先看下其源码@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExclud

2020-07-21 16:51:30 167

原创 SpringBoot 源码阅读(3):WebApplicationType

WebApplicationType为一个枚举类,主要有三个枚举值:public enum WebApplicationType{ /** * The application should not run as a web application and should not start an * embedded web server. */ NONE, /** * The application should run as a servlet-based web appli

2020-07-21 16:18:01 446

原创 闲杂笔记:URL与URI

URL与URIURI包括URL和URNURI(Universal Resource Identifier)统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。URL(Universal Resource Locator) 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。URN(Universal Resource Name) 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。

2020-07-21 16:01:38 89

原创 SpringBoot 源码阅读(2):ResourceLoader与Resource

ResourceLoader与ResourceResourceLoader顾名思义,用于加载资源,是org.springframework.core.io提供的一个借口:public interface ResourceLoader { /** Pseudo URL prefix for loading from the class path: "classpath:". */ String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PR

2020-07-21 15:54:55 318

原创 Java基础:类型注解

类型注解1.8版本关于注解主要增加了两个新特性:重复注解与类型注解重复注解基于新增元注解 @Repeatable,具体参见博客原来注解只能用于声明,基于ElementType新增的枚举值TYPE_USE,注解可用于任何使用类型的地方(不能对void返回类型添加注解),即类型注解。类型注解通常被用来在Java程序中做强类型检查,从而帮助避免发生错误。...

2020-07-18 11:17:00 91

原创 JDK源码阅读(9):元注解

元注解@Target@Retention@Documented@Inherited为Java的元注解,用于注解注解的基本信息@Target注解的目标:@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Target { /** * Returns an array of the kinds of elements an a

2020-07-18 10:44:29 110

原创 SpringBoot问题笔记:http请求参数含有特殊符号[]

http请求参数含有特殊符号[]{}请求报错,调试控制器函数没有触发。怀疑是请求参数中含有字符 [ ]由博客了解到是由于Tomcat的新版本中增加了一个新特性,严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。解决方法:修改tomcat配置@Spring

2020-07-01 11:12:09 2353 1

原创 闲杂笔记:dll信息查看

dll信息查看dll:动态链接库有时候我们需要调用一些第三方的dll,但没有其的一些信息,如果电脑安装有VS,可考虑通过DUMPBIN指令查看dll的一些简单信息。usage: DUMPBIN [options] [files] options: /ALL /ARCHIVEMEMBERS /CLRHEADER /DEPENDENTS /DIRECTIVES /DISASM[:{BYTES|NOBYTES}]

2020-06-24 11:14:28 212

原创 SpringBoot问题笔记:访问static下文件

访问static下文件需要通过File对static下文件进行操作,但通过**classpath:/static/…**建立File找不到相应的文件。解决方案:通过 new ClassPathResource(static/…).getFile(); 获取相应的文件问题分析:路径不对,实际路径应为:E:\workspace…\build\resources\main\static…通过 ClassPathResource获得绝对路径...

2020-06-23 15:33:09 500

原创 JDK源码阅读(8):PriorityQueue

PriorityQueueversion:1.8今天看一种特殊的队列“优先级队列”优先级队列名为队列,但不满足一般队列先进先出的特性,而是优先级最高(或最低)的先出,其底层使用堆实现。堆是一种特殊的二叉树,其不同于二叉搜索树,是不完全有序的,其从根节点到叶子节点形成的每条路径都是有序的,但各条路径之间是不要求有序的,如此保证了根节点是全局的最大(或最小)的节点。同时,堆是完全二叉树。根据根节点是最大还是最小,可称为大根堆或小根堆。public class PriorityQueue<E&g

2020-06-09 16:00:06 83

原创 JDK源码阅读(7):Object

Objectversion:1.8java.lang.Object是Java所有类的父类,可以说是JDK源码的“根”package java.lang;public class Object { …………}先看看其全貌:finalize每个对象在构造时可能需要做些准备工作,这就是每个类的构造方法,同样的,在析构前可能要做些善后工作,对应的方法就是finalizeprotected void finalize() throws Throwable { }Object类的该方法是空

2020-06-08 19:32:57 99

原创 JDK源码阅读(6):Comparable 与 Comparator

Comparable 与 Comparatorversion:1.8在上一篇中我们看到TreeMap在进行值的比较的时候考虑了两种方式:Comparable 与 Comparator,在这里对其进行下比较。Comparablepackage java.lang;public interface Comparable<T> { public int compareTo(T o);}Comparable是位于java.lang包下的一个接口,内部只有一个方法public int

2020-06-06 11:18:21 94

原创 JDK源码阅读(5):TreeMap

TreeMapversion:1.8TreeMap基于红黑树实现对存储的键值对的快速查询,其在多线程下使用不安全。红黑树是一种平衡二叉搜索树。二叉搜索树是一种特殊的二叉树,其每个节点的值大于其左子节点的值,大于其右子节点的值(当然也可能反过来),从而可以类似二分查找快速查找到想要的值。若二叉搜索树节点的左子树与右子树的节点数目相差过大,会影响查找效率,极端情况下每个节点只有右子节点,这个时候二叉树已经退化为链表。平衡二叉搜索树通过设置一些限制尽量保证每个节点的左子树与右子树的节点数目相差尽量小,

2020-06-05 20:01:33 107

原创 算法题(5):最长回文子串

最长回文子串难度:中等题目描述:找到字符串中最长的回文子串。思路:“最……”等问题常见思路之一就是动态规划,回文子串减去头尾也是回文子串,故考虑可以由短到长,每个字符本身就可以认为是回文子串,相邻的两个字符如果相同也是回文子串,接下来依次判断长度为3,4直到字符串本身的长度的子串,若其为回文子串,其首尾字符应相同且其内部子串为回文子串。优化:若当前得到的最长回文子串的长度+2小于当前寻找子串的长度,不可能有更长的回文子串,可跳出循环。状态转移方程:P(i, j) = P(i+1, j−1) ∧ (

2020-06-03 16:56:24 81

原创 JDK源码阅读(4):HashSet与Hashtable

HashSetHashSet用于存储无序不重复的元素。public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable由于HashMap的key满足这一特性,故其底层使用HashMap实现。private transient HashMap<E,Object> map;public HashSet()

2020-06-03 10:49:50 97

原创 JDK源码阅读(3):HashMap

HashMapversion:1.8已读getputresizeremoveHashMap基于哈希算法实现对存储的键值对的快速查询,其在多线程下使用不安全。本文红黑树相关的内容不多做介绍。public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 每一条键值对使用一个Node结点存储,使用Node数组存储所有的键

2020-05-26 19:29:06 86

原创 算法题(4):合并两个有序链表

问题描述:合并两个有序链表,使得合并后的链表仍然有序。难易度:简单思路分析:获得两个链表较小的结点,将该结点作为头结点,与两个链表剩余结点的合并链表连接起来,即为要求的链表。即通过递归可实现两个有序链表的合并。递归终止条件:两个链表有一个为空。代码如下:public class O16 { public ListNode merge(ListNode list1, ListNode list2) { if(list1 == null) return l

2020-05-26 15:00:20 159

原创 JDK源码阅读(2):Queue

Queueversion:1.8不同于Stack类提供的栈的具体实现,Queue为JDK提供的队列(先进先出)的接口。/** * @see java.util.Collection * @see LinkedList * @see PriorityQueue * @see java.util.concurrent.LinkedBlockingQueue * @see java.util.concurrent.BlockingQueue * @see java.util.concurrent

2020-05-25 16:32:54 66

原创 算法题(3):单向链表倒数第k个结点

单向链表倒数第k个结点难易度:简单使用两个引用指向链表中的结点,并使两者之间相隔(k-1)个结点,如此,当快的引用指向尾结点时,慢的引用指向倒数第k个结点。代码如下:public class Main { public ListNode FindKthToTail(ListNode head,int k) { ListNode node1 = head; ListNode node2 = head; for(int i = 1;

2020-05-25 15:47:36 105

原创 JDK源码阅读(1):Stack

StackStack为JDK对于栈(先进后出)这一数据结构的实现,其继承Vector类,其操作主要是对Vector类的一些封装。public class Stack<E> extends Vector<E>栈主要有三个操作:push:入栈pop:出栈peek:查看栈顶元素push源码如下:public E push(E item) { addElement(item); return item;}addElement(E obj)为继承自Vec

2020-05-22 18:12:46 87

原创 算法题(2):青蛙跳台阶

青蛙跳台阶变形题问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。难易度:简单传统青蛙跳台阶问题(一次跳一阶或两阶)通过递归、动态规划可轻易解决。本题对每次跳的阶数不做限制,得方程:f(n) = f(0) + f(1) + …… + f(n -1)f(0), f(1)=1即跳到第n阶可直接跳到第n阶,可先跳到第1阶,再直接跳(n-1)阶,可跳到第2阶,再直接跳(n-2)阶等。由方程易得f(2)=2,f(3) =4,……,

2020-05-22 16:05:48 338

空空如也

空空如也

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

TA关注的人

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