- 博客(34)
- 收藏
- 关注
原创 Spring源码之Bean的注册(注解方式)
1.创建AnnotationConfigApplicationContextAnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.eragon");这里传的参数是包名,spring会自动扫描该包下所有的类,对bean进行配置。public Annotation...
2019-11-15 17:28:19
306
原创 Spring源码之Bean的注册(使用XML配置的方式)
本文分析的Spring源码是5.2.2版本,使用Gradle进行管理。一、Bean的注册,先来看通过XML配置Bean的方式1.配置applicationContext.xml:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/bean...
2019-11-15 14:43:26
476
原创 JDK8 MAP
JAVA8 MAP新增的API1.foreach,使用foreach可以很方便的对map进行遍历:Map<String, String> map = new HashMap<String, String>(){ { put("1","e"); put("2","e"); ...
2019-10-29 09:47:21
727
原创 JDK源码阅读 Throwable/Exception/Error
1.strackTrace、backTrace、cause、message、suppressed 答:StackTraceElement[] strackTrace:数组,保存所有栈调用的相关信息(方法、类名、文件名、行号) Object backTrace:用于回溯 为native变量 cause: 表示当前异常是哪个异常引起的,如果没有则为null...
2019-10-20 19:40:03
360
原创 JDK源码阅读 AbstractStringBuilder/StringBuffer/StringBuilder
1.为什么初始化就把数组的大小设为16,而如果使用有参构造函数也是要传入的字符串长度+16? 答:因为使用StringBuffer或者StringBuilder都会频繁的使用append,假设value数组使用固定长度,那么每一次append或者remove都需要创建新的数组进行扩充,消耗性能,ArrayList也是这样设计的。这也是为什么额外用count变量来表示length。...
2019-10-20 19:37:43
165
原创 JDK源码阅读 String
1.String是如何做到不可变?为什么要将它设计为不可变类? 答:首先String类是被final修饰,不能被继承;它把数据存放在一个数组value中,value同样被final修饰;所有对String对象进行操作,包括构造函数等涉及到都是重新创建一个String对象,且涉及到数组value的时候,都是重新copy一个新的数组,避免改动影响原来的value。 1&g...
2019-10-20 19:33:49
212
原创 JDK源码阅读 Object
1.静态代码块里的registerNatives()方法,因为Object是所有java类的父类,且该方法在静态代码块里,所以只有创建任何对象都会调用这个方法, 答:该方法的作用是将java层的方法和本地方法名对应起来,方便调用本地函数 2.为什么Object是所有类的父类,java如何实现的呢 答:可以使用Object里定义好的一些方法,如果一个类没有显示...
2019-10-20 19:31:07
131
原创 JDK8 Optional
JDK8 Optional我们经常会在代码里去判断对象是否为null,以避免NPE的问题。JDK8提供了Optional类配合函数编程和流式编程去更加优雅的处理Optional。一、APIOptional的构造函数被private修饰了,即只能用它提供的2个静态方法创建对象:of(T t) 只能接受不为null的对象,否则抛异常ofNullable(T t) 可以接受为nu...
2019-10-20 19:22:46
1182
1
原创 记录遇到的问题
数据库和JavaBean的类型不一致导致精度丢失@Datapublic class Nav { private String rate;}@Repositorypublic interface NavMapper { @Select("select rate RATE from nav") Nav find();} @RequestMappin...
2018-10-12 16:11:59
273
原创 SpringMvc方法获取和返回参数源码探究
简介SpringMvc的方法里我们可以接受各式各样类型的参数,Stirng、Integer、@RequestBody(Json)、ModelAndView(Spring自动注入的一些参数)等,那么SpringMvc是如何将这些参数注入的呢?例子分别用postman访问上面4个接口除了第一个接口调用成功,另外三个接口均报错了。为什么会报错呢?@RequestBod...
2018-09-25 16:08:11
466
原创 SpringBoot2.0学习 (一)
SpringBoot是什么?SpringBoot是由Pivotal团队提供的全新框架 ,它使用特定的方式进行配置(大多数为自动配置),省去了Spring繁琐的xml配置,内置了http服务器,可以通过java程序启动web容器,也整合了常用的框架。总之,SpringBoot帮助程序员进行快速开发和构建项目。SpringBoot和SpringMvc在使用SpringBoot构建web项目...
2018-09-23 20:25:48
1070
原创 JDK8中的Streams API
1.为什么需要stream stream作为JDK8的一大亮点,它和IO中的输入流或者输出流不是一个概念。在JDK8中,它是对集合对象的功能增强,针对集合对象它提供了各种非常便利的高效聚合操作,并且配合JDK8的Lambda表达式和函数式编程使得对集合的各种操作更加简单。同时还提供了串行和并行两种模式进行对集合的操作。通常编写并发的代码很容易出错,而使用Stream API只需要简单的添加一...
2017-12-19 17:55:03
356
原创 Oracle的行转列和列转行
Oracle行列互转函数的学习: 1、WM_CONCAT 用scott用户自带的emp表作为例子,查询每个部门下所有的雇员的名字:select deptno,wm_concat(ename) from emp group by deptno; 查询结果为: 2、LISTAGG oracle新增的listagg函数也是对字符串的行列转换,但是功能比wm_con
2017-12-10 12:53:51
408
原创 Oracle分析函数
Oracle的分析函数入门: 1、什么是分析函数:分析函数是Oracle专门用于解决复杂报表的功能强大的函数,它可以在数据中进行分组和排序后返回数据,并且与group by 不同的地方是,它的每一组的每一行都能返回一条数据。 2、如何使用分析函数: 分析函数都带有一个开窗函数over(),包含三个分析子句:partition by、order by 、row
2017-12-10 10:24:46
264
原创 《深入理解Java虚拟机之栈帧的结构》
Java虚拟机栈是线程私有的,它描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 每一个栈帧都包含了局部变量表、操作数栈、动态链接、方法返回地址和一些额外的附加信息。在编译成class文件后,栈帧中需要多大的局部变量表和多深的操作数
2017-08-31 15:19:33
1588
原创 《深入理解Java虚拟机学习笔记之垃圾收集器与内存分配策略》
Java运行时内存区域分为5个部分,其中程序计数器、虚拟机栈、本地方法栈都是随线程而生,随线程而灭,所以这个3个区域不需要过多考虑回收内存的问题。而堆内存和方法区则不一样,一个接口中的多个实现类 需要的内存可能不一样一个方法中的多个分支需要的内存也不可能一样,只要在程序处于运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的也就是这部分对象。 Java的垃...
2017-08-16 21:44:26
315
原创 《深入理解Java虚拟机学习笔记之Java内存区域与内存溢出异常》
1.Java虚拟机运行时内存结构 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间。Java1.7的虚拟机运行时数据区域结构如下图所示: 程序计数器 程序计数器是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程
2017-08-12 17:28:04
216
原创 《Effective Java 学习笔记 第二章》
对于所有对象都通用的方法1.覆盖equals时请遵守通用约定自反性:对于任何非null的引用值x,x.equals(x)必须返回true 对称性:对于任何非null的引用值x和y,当且仅当x.equals(y)返回true时,y.equals(x)返回true 传递性:对于任何非null的引用值x、y、z,如果x.equals(y)返回true,并且y.
2017-08-04 15:20:31
215
原创 《Java设计模式之组合模式》
《组合模式》 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。public abstract class Component { protected String name; public Component(String name) { this.name = name; } //添加节点 pub
2017-08-04 15:04:11
184
原创 《Java设计模式之代理模式》
《代理模式》 代理模式:为对象提供一种代理以控制这种对象的访问。在Java中有静态代理和动态代理两种实现方式。 静态代理: 拿日本动漫《棋魂》举例,佐为只是灵魂,它要下棋必须通过阿光这个“代理”,我们用代码实现一下://Subjectpublic interface WeiQi { void playWeiQi();}//RealSubjectpub
2017-08-03 15:19:48
252
原创 《Effective Java 学习笔记 第一章》
1.使用静态工厂方法替代构造器这里的静态工厂并不是设计模式中的静态工厂,它就是用一个静态方法来替代构造器产生类的实例。 优点:1.由于是方法,所以有名称,如果有良好的命名就可以通过名字判断该方法到底返回的时什么实例,可以区分重载的构造器。2. 缺点:
2017-08-02 16:47:17
297
原创 《Java设计模式之状态模式》
《状态模式》 我们经常使用if-else来应付状态的切换,这样往往会导致程序难以阅读、维护和扩展,假设我们现在要模拟交通灯的切换,顺序是绿灯-黄灯-红灯-绿灯...,我们先用if-else来模拟一下:private int state = 0;public void change(){ if (state==0){ System.out.println("显示绿灯"); st
2017-08-02 14:09:24
239
原创 《Junit框架的使用》
Junit是用Java编写的一套测试框架,它的好处就不再多说,Junit4相比junit3有很大的改动,这里就来学习Juni4的具体使用 Eclipse快速生成测试类 1.对需要测试的类右键new 添加一个Junt Test Case
2017-08-01 18:42:10
235
原创 《Java设计模式之迭代器模式》
《迭代器模式》 Java中所有Collection下的集合都有一个iterator()方法返回Iterator接口的实现类,用于对该集合的遍历操作,这实际上就使用到了迭代器模式:提供一个方法顺序访问一个聚合对象的每一个元素,而有不暴露该对象的内部实现。 迭代模式的结构: 用代码模拟一下迭代器模式://抽象迭代器public interface MyIt
2017-08-01 16:07:38
196
原创 《Spring中的模板设计模式》
Spring中有很多带template结尾的类,比如jdbcTemplate、hibernateTemplate等对数据库操作的类,它们就使用到了模板模式,但是spring并没有使用继承的方式来实现模板模式,而是采用组合的方式是的使用更加方便、更易于扩展。 先使用传统的方式模拟一下jdbcTemplate
2017-07-30 19:47:03
1081
原创 《Java设计模式之模板模式》
《模板模式》 模板模式:定义一个算法结构,让部分步骤延迟到子类去实现,使得子类不得改变算法结构就可以重定义算法的某些特定本步骤。 模板模式组成:抽象父类:实现了一个模板方法,定义了一个算法骨架,部分算法延迟到子类实现 具体实现类:实现父类中抽象的算法。 以魔兽世界战士为例, 代码如下://抽象父类public abstract class War
2017-07-29 16:55:11
173
原创 《SpringMvc中的适配器模式》
适配器模式是将一个接口转换成目标接口,让程序有更好的复用性和扩展性。SpringMvc中的适配器处理器HandlerAdapter就是用了这个设计模式。 HandlerAdapter是SpringMvc的处理器适配器,会根据传递过来的controller类型不同而调用不同的HandlerAdapter进行处理,也就是调用请求的方法。 HandlerAdapter处理的大致流程:Dis
2017-07-28 21:09:05
1425
原创 《Java设计模式之适配器模式》
《适配器模式》 现实生活中的用到适配器的例子有很多,比如插座的适配器、电脑usb的转接头等等,那么在java中适配器模式其实起着相同的作用,它能将一个接口通过适配器转换成我们想要的接口。 两种适配器类型:1.类适配器模式:通过继承被适配的接口和目标接口,来实现转换接口的功能。因为Java并不支持多继承,所以用类适配器模式会有局限性。
2017-07-27 22:50:12
198
原创 《Java设计模式之命令模式》
《命令模式》 命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。将发出请求的对象与接收请求的对象分隔开来,松耦合。 玩网游的人都知道“宏命令”的概念,玩家可以编制自己的宏命令来节省操作,这里以魔兽世界为例,先使用紧耦合的方式实现角色的一连串技能施法:public class Wizard { p
2017-07-25 14:57:14
187
原创 《Java设计模式之单例模式》
《单例模式》 Java的单例模式是非常常见的设计模式,在Jdk的库中也被广泛应用,这里介绍常见的饿汉模式和懒汉模式,以及如何在多线程的环境下完善懒汉模式: 饿汉单例模式//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { private Singleton1() {} private sta
2017-07-24 14:39:59
173
原创 《Java设计模式之观察者模式》
《观察者模式》 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。当这个主题对象的状态发生变化时,就会通知所有的观察者,使他们更新自己。 1.观
2017-07-23 15:26:40
187
原创 《Java设计模式之装饰者模式》
《三》装饰者设计模式在这里直接使用HeadFist设计模式中的星巴兹咖啡店为例(不同品种的咖啡配上各类的调料对应不同的价格),在这里我们首先使用继承的方式来实现://抽象父类public abstract class Beverage { protected String description; void getDescription(){ System.out.printl
2017-07-22 11:28:55
214
1
原创 《Java设计模式之策略模式》
《二 》策略模式相信很多人都玩过魔兽世界这款游戏,它里面的展示有三种姿态:防御、狂暴、武器,那么在不同的场景下我们需要使用不通的姿态,比如当MT抗怪就需要使用防御姿态,战场需要使用武器姿态,而输出可能就要使用到狂暴姿态。那么在Java程序中使用硬编码的方式实现如下:
2017-07-20 18:55:27
441
原创 《Java设计模式之工厂模式》
自己的博客之旅就从Java设计模式开始,记录和督促自己的学习!!!《一》工厂设计模式:1.工厂模式的三类 1) 简单工厂模式 2 ) 工厂模式 3 ) 抽象工厂模式 2.简单工厂模式 又被称为静态工厂,如其名,这个模式非常简单,本质就是一个工厂类角色接收不同的参数返回不同的产品。该工厂类扮演的就是一个...
2017-07-18 08:42:01
266
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人