自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

NYNYNY

学习有如逆水行舟。

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

原创 源码学习之AOP(五)-拦截器的实现

接上文介绍了Srping AOP中代理对象的生成,今天介绍下另一个重要部分:拦截器,正是通过拦截器,才能帮我们实现代理的功能。JdkDynamicAopProxy 在代理模式中,我们实现代理工作是通过实现InvocationHandler接口,重写其中的invoke()方法,在method.invoke()前后加入我们需要代理的逻辑,在JdkDynamicAopPro...

2019-04-18 09:00:43 1183

原创 源码学习之AOP(四)-代理对象的生成

在Spring AOP中,创建代理对象是很重要的一部分内容,还记得之前写的代理模式的那篇文章么,在那个里面,我们封装了一个getProxy()方法,用来返回生成的代理对象,其实这个就是模仿的Spring的写法,Spring通过AopProxy提供接口方法getProxy()用来获取代理对象,具体的实现则是交由自己的子类实现。AopProxy 我们先来...

2019-04-17 09:50:22 302

原创 源码学习之AOP(三)-Spring AOP使用

接上文增强的内容,本文我们将介绍下Spring AOP的使用,以及增强执行的顺序。 在spring中使用aop有很多种选择,即可以选择拥有完整aop解决方案的AspectJ,还可以选择Spring AOP,它侧重于提供和ioc容器整合的AOP实现。我们接下来就介绍下他的两种使用方式:@AspectJ和Schema-based AOP.@Aspe...

2019-04-17 09:45:10 321

原创 源码学习之AOP(二)-增强使用

在上一篇中,我们介绍了aop相关的基本概念,简单介绍了下Spring AOP中的advice,这一篇我们就来熟悉下这些advice的使用。增强类型 按照增强在目标类方法中的连接点位置,增强分为以下五类:前置增强BeforeAdvice是spring中提供的前置接口,但因为目前只支持方法级别的通知,所以真正使用的前置增强接口是MethodBeforeAdv...

2019-04-17 09:37:19 167

原创 代理模式

接之前介绍的策略模式,今天我们学习另一种设计模式:代理模式。代理模式 定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 它的uml示意图如下所示: 我理解的代理模式是为了让编码更符合单...

2019-04-17 09:29:08 119

原创 源码学习之Spring AOP(一)-AOP基础

今天开始学习spring中的另一个重要部分:aop,由于aop中涉及到很多相关概念,本文就做一个基础介绍,先让大家认识一下aop。AOP概念 AOP,也就是面向切面编程。我们都知道java是面向对象的语言,按照这个原则,每个对象都应该只做属于它自己的事(单一职责原则),但在实际开发中,有些场景用面向对象不是很好理解,比如对一个工程的所有方法都添加一个打...

2019-04-17 09:18:40 141

原创 源码学习之FactoryBean

本篇介绍一下BeanFactory的双胞胎兄弟FactoryBean.FactoryBean介绍我们从名称上就可以知道FactoryBean是一个bean,只不过这个是一个工厂bean,FactoryBean是spring提供的一个工厂类的接口,通过这个工厂bean可以获取我们需要的bean实例。当我们通过getBean()来获取bean时,通过这个bean...

2019-04-17 09:14:21 124

原创 源码学习之bean的生命周期

在之前的文章中,我们比较过java bean和spring bean的区别,其中最主要的一点就是spring bean的生命周期是由容器管理的。这里我们就来了解下spring bean的生命周期。生命周期 spring中的bean从beanDifinition阶段开始,主要经历下面几个过程:实例化 属性填充 BeanNameAware/BeanFactoryA...

2019-04-17 09:11:55 155

原创 源码学习之DI-代码篇

接上文,这里结合源码分析一下依赖注入的过程和实现。依赖注入触发 依赖注入一般发生在用户首次向容器索取bean时,也就是通过getBean()方法获取需要的bean实例,但是这个也有例外,我们可以通过bean定义的lazy-init = false(默认)让容器完成对bean的预实例化。这样依赖注入就会随着容器的初始化而完成。依赖注入实现 get...

2019-04-17 09:08:54 407

原创 源码学习之DI-基础篇

接上文beanDefinition的内容,接下来会介绍spring中的依赖注入部分。DI 当我们用bean定义来描述一个bean的时候,这个bean往往需要依赖于其他对象,IOC容器在实例化这个bean的时候,会将依赖的对象进行注入,这个过程就叫依赖注入。依赖注入主要有两种方式:Constructor-based dependency injectio...

2019-04-17 09:02:57 219

原创 源码学习之IOC容器初始化三部曲(三)

接上篇BeanDefinition的载入,本文介绍ioc容器初始化的最后一个内容:BeanDefinition的注册.注册过程DefaultBeanDefinitionDocumentReader#processBeanDefinition():/** * Process the given bean element, parsing the bean defini...

2019-04-17 08:57:35 115

原创 源码学习之IOC容器初始化三部曲(二)

接上篇BeanDefinition的资源定位,这篇主要介绍BeanDefinition的载入。BeanDefinition的载入BeanDefinition的载入过程就是将用户定义的Bean对象解析转换为BeanDifinition对象。载入过程 接上文介绍到的Resource定位部分:AbstractBeanDefinitionReader#loadB...

2019-04-16 23:06:17 140

原创 源码学习之IOC容器初始化三部曲(一)

SpringIOC容器初始化分为三个过程:BeanDefinition的Resource定位 BeanDefinition的载入 BeanDefinition的注册这里主要介绍Resource定位过程。Resource的资源定位 我们知道IOC容器中管理的对象是BeanDefinition,这是POJO对象在spring内部的存储形式 ,我们所说的Resourc...

2019-04-16 22:59:13 202

原创 源码学习之Bean Definition到BeanDefinition

接上文ioc容器初始化部分,在之前的介绍中,我们介绍了整个ioc容器初始化的过程,但是对于其中的BeanDefinition的解析部分一笔带过,这里就对BeanDefinition做个介绍。Bean Definition 在IOC容器中,管理的对象是Bean,对于配置文件来说,他们就是<bean>标签配置的对象,这就是我们对Bean的定义...

2019-04-16 21:09:56 178

原创 源码学习之Spring IOC容器体系

ApplicationContext为应用提供配置,通过:ListableBeanFactory可以访问应用中的组件;ResourceLoader可以加载资源;ApplicationEventPublisher可以注册监听器分发事件;MessageSource可以支持国际化;

2019-04-16 20:45:10 145

原创 Redis学习(二)-Redis进阶

Redis的key过期淘汰策略 Redis支持对key设置过期时间,对于这些过期的key并不是到了过期时间就马上被清理,Redis提供了三种机制来保证对过期key的清理: 定时删除:在设置过期时间的同时,设置一个定时器用来清理key 缺点: 会占用cpu 惰性删除:当调用到key时,检查这个key是否已过期,如果过期执行删除; 定期删除:Red...

2019-03-10 23:02:48 145

原创 Redis学习(一)-Redis介绍

Redis介绍 Redis 是一个开源免费的,遵守BSD协议的高性能key-value数据库。Redis特点Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,...

2019-03-10 22:55:14 187

原创 SpringMVC启动流程分析

*基于3.1.2我们知道web.xml是一个web应用的核心配置文件,也是我们认识应用的最佳途径,这次我们同样从web.xml入手.通过分析里面的配置进而了解整个spring的启动流程.以目前正在经手的项目实例为参考,附上web.xml中的主要配置(仅附上涉及到spring的部分,业务相关部分已略去):ContextPram:&lt;context-param&gt; ...

2018-11-16 20:04:43 141

原创 Spring配置解析之Component-scan解析

*基于3.1.2进行源码解析.首先看一段项目中关于component-scan的配置:&lt;context:component-scan base-package="com.suning.rsc.server,com.suning.uops"&gt; &lt;context:exclude-filter type="annotation" expressio...

2018-11-15 17:00:26 3142

原创 Java IO之OutputStream

Java io中通过InputStream字节输入流用来将数据读取到内存中,同时也提供了字节输出流OutputStream用来从内存中读取数据。         和InputStream结构类似,我们也通过以下几个类来了解OutputStream。         OutPutStream OutputStream抽象类中主要提供了三个方法:输出单个字节public a...

2018-09-05 21:32:25 1263

原创 Java IO之InputStream

Java io部分的知识是比较重要的一部分内容,io是理解nio的基础,nio又是理解netty的基础。相信看到java io体系的结构图的时候都会感叹他的庞大:    在网上查阅相关资料的时候,也没有一个很详细的理解,大部分都是陈列一下api的用法,所以在这里将自己对io的理解记录下来。   InputStream也就是io中的输入流,用来处理字节对象,也叫字节流,他将数据以字节...

2018-09-01 16:17:40 1485

原创 Java基础之序列化

最近几天重新看了下序列化部分的内容,今天将它整理出来。什么是序列化/反序列化序列化是java开发中经常可以听到的一个词,那么究竟什么是序列化呢?简单来理解的话就是:将java对象转换成字节序列以二进制数据的形式保存在本地的操作就叫做序列化,将二进制数据还原成java对象的过程就叫反序列化。     我们画一个图来说明下:2.怎么让对象序列化/反序列化  虽然序列化的目的是为了...

2018-08-29 23:57:23 151

原创 Java基础之注解

在我们日常的开发过程中,会经常遇到注解,比如重写方法时的@Override,使用springmvc中用到的@Controller,@Autherwide,@RequestMapping等等,注解在代码中就好像一个标签,通过这个标签我们或者编译器可以获取制定的信息,也可以通过这个注解来实现特定的功能。1.认识注解 java预置注解(jdk7) java提供了几个内置的注解:@Dep...

2018-08-07 23:08:24 166

原创 Java基础之反射

反射是java中比较重要的一块知识,虽然平时的开发中可能不太用到反射,但是在框架的开发中,反射是非常重要的,而且各个框架中大量使用的注解,在解析注解的时候也需要用到反射,所以说反射是框架的灵魂。说了这么多,其实反射做的事情很简单,就是在运行时获取类或者对象的信息。1.获取class对象  我们将.java结尾的文件称为源文件,源文件最终会被编译。class文件,也就是字节码文件,反射的作用...

2018-08-06 19:57:40 154

原创 Java基础之异常处理机制

Java的异常处理机制可以让程序有更好的容错性,提高程序的健壮性。在程序运行出现意外情况时,系统通过生成Exception对象来通知程序。将业务功能代码和错误处理代码分离,提高可读性。java异常继承体系     Java将程序中的意外情况分为两种:Error(错误)和Exception(异常),都继承自父类Throwable.     Error一般都是与虚拟机相关,如虚拟机错误,系...

2018-07-24 16:47:04 126

原创 Java基础之4种引用

我们知道java中有一个垃圾回收机制(gc),在合适的时候gc会清理内存中的垃圾,释放内存。虽然Object类中提供了finalize()用来清理资源,但是finalize()具有不确定性,不能明确知道什么时候会对资源进行回收。java提供了4种引用类型,让开发者可以直接控制对象的生命周期,配合引用队列可以知道对象在何时被gc清理。按照级别高低从高到低分为强引用(StrongRefrence)...

2018-07-23 10:39:56 144

原创 Java基础之final

final是java中常见的关键字之一,从字面意思来看,使用final修饰的内容通常都是确定好的内容,不需要再改变值。我们从final可以修饰的对象来了解final。1.final修饰变量 final可以修饰成员变量和局部变量,但是两者用法有一些细微区别。final修饰成员变量     我们知道成员变量根据是否使用static修饰符修饰分为类变量和实例变量。     使用fina...

2018-07-22 14:39:50 121

原创 Java基础之成员变量和局部变量

                                                                       成员变量和局部变量       在介绍成员变量和局部变量之前,先看一段简单的代码,如果不能很明确的给出答案的话,请看完全文。package com.ljw.field;/** * Created by liujiawei on 2018/7...

2018-07-18 22:35:41 183

原创 Java基础之数据类型

数据类型    java中有两种数据类型:基本数据类型和引用数据类型。我们用一张图简单概括下,有一个直观的印象:下面会具体介绍八大数据类型。整型(定点数):byte:1个字节大小,占用内存8位,大小范围是-2^7~2^7-1;short:2个字节大小,占用内存16位,大小范围是-2^15~2^15-1;int:4个字节大小,占用内存32位,大小范围是-2^31~2^31-1;long:8个字节大小...

2018-07-15 21:09:28 191

原创 Java多线程(六)线程组和线程池

线程组和线程池线程组 1.线程组介绍    java中用线程组(ThreadGroup)来同时管理一批线程,对线程组做的操作相当于对里面所有的线程都做了同样的操作,线程所属的线程组在运行过程中无法修改。    可能大家听到更多的是线程池的概念,但其实只要使用过线程,那么你就已经使用过了ThreadGroup,只是你自己并不知道而已,我们看下Thread类的构造方法: public Thread(R...

2018-07-10 18:48:18 1655 2

原创 Java多线程(五)线程通信

线程通信    java中提供了三种方式进行线程通信:1.使用同步监视器控制线程通信:    我们在线程同步中已经介绍过同步监视器主要就是通过同步方法和同步代码块实现的,同步监视器中的线程通信就是通过调用同步监视器的wait(),notify()和notifyAll()方法实现。线程通信中有个经典的生产者消费者模式,我们用同步监视器的方式是来实现生产者消费者模式,看一下是怎么工作的:    工厂类...

2018-07-09 15:31:12 191

原创 Java多线程(四)线程同步

线程同步    系统的线程调度有一定的随机性,当多个线程访问同一个数据时,不作处理的话,很容易出现线程安全问题,我们可以通过线程同步来解决这个问题。     我们用银行取钱的场景的来模拟这种情况:银行类,可以设置账户上的余额,提供一个取钱的方法,只要没有超过账户上的钱就扣除对应的钱数:import com.sun.scenario.effect.impl.prism.PrImage;/** ...

2018-07-08 23:53:48 167

原创 Java多线程(三)线程控制

线程控制    java中提供了很多方法,让我们可以对线程进行控制。我们今天主要学习其中的join线程,后台线程,线程睡眠,线程让步和怎么改变线程优先级。join线程: join线程可以让一个线程等待另一个线程执行完毕以后再执行。我们还是通过例子来进行学习,有这么一个场景:我们要吃一碗泡面,要经过四个步骤,放水、下面、吃面、洗碗。用我们前面学到的知识来写的话,我们的代码会是这样子:package ...

2018-07-06 20:33:29 3428

原创 Java多线程(二)线程的生命周期

线程的生命周期    当一个线程被创建并启动以后,它并不是一直处于运行状态,他会有多个状态,在一个线程的生命周期中,总共有五种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)。我们具体说下线程在不同情况下的状态:新建状态: 当我们通过new创建线程实例的时候,这个线程就已经除了新建状态;就绪状态: 当调用线程对象的start()方法以...

2018-07-06 13:47:44 239

原创 Java多线程(一)认识多线程

认识多线程    Java中有关多线程的只是虽然只有几章节,但是真正扩展开来几本书都不用,让我们从基础开始,一步步的学习多线程相关的知识。1.基本概念介绍    进程:系统中分配资源的一个调度单位。    线程:也被称为轻量级进程,是进城中的调度单位。    并发:多个指令轮流执行。    并行:多个执行同时执行。    一个程序至少有一个进程,一个进程中可以有多个线程。2.多线程的基本实现要想实...

2018-07-06 01:20:46 282

原创 Java之类加载机制

类加载机制       了解jvm中的类加载机制,可以帮助我们更好的理解程序的运行。(由于没有深入了解过jvm,本文以理论为主,日后有实操会进行补充)。1.类的加载过程    类的整个加载过程主要分为:加载,连接,初始化,使用和卸载五个阶段,其中连接中有验证,准备,解析三个过程。看一下整个的加载过程示意图:我们接着了解主要过程中所作的操作:加载: 类的加载主要通过类加载器来实现,通过不同的类加载...

2018-07-05 13:47:36 127

原创 Java之抽象类和接口

抽象类和接口    抽象类和接口的使用在java开发中是比较常见的,今天我们就来比较下接口类和抽象类的之前的联系和区别。抽象类:1.什么是抽象类?        使用abstract修饰符来修饰的类就是抽象类,使用abstract修饰的方法就叫抽象方法,抽象方法没有方法体。抽象类除了不能实例化以外,其他都和普通的java类一样。2.抽象类需要遵守的规则(1)抽象类必须使用abstract修饰符来修...

2018-07-05 09:06:21 139

原创 Java之String,StringBuffer和StringBuilder

String,StringBuffer和StringBuilder        在java中有关这三个对象的比较一直是一个老生常谈的问题,大部分人了解的也就限于StringBuffer是线程安全的,而StringBuilder是非线程安全的。今天我们一起看下这三者之间的联系和区别。        我们先从类图中看下这三个类之间的关系:    可以看到String,StringBuffer和Str...

2018-07-04 14:12:07 290 2

原创 Java之== 和 equals()的区别

== 和equals简单概括就是: ==比较基本数据类型的值和引用类型对象的引用地址,equals比较对象的内容。下面我们具体来说一下这两个: ==: 我们知道java在内存中有栈(stack)和堆(heap)之分。栈中存放基本数据类型和引用类型的变量,堆中存放对象的实际内容。当我们通过new实例化一个对象时,在内存是这样存储对象的:Student s = new Student("jack",1...

2018-07-03 22:36:33 323

原创 Java集合框架(四)Map

Map    先看下map的类图:        我们主要学习HashMap,LinkedHashMap,Hashtable,WeakedHashMap和TreeMap。1.map介绍    map在java中用来保存具有映射关系的数据,以键值对的形式保存,一个key对应一个value,key不可以重复。可以把map中的key部分看成一个set集合,无序不重复,把value部分看成是一个list集...

2018-07-02 15:16:35 530 1

空空如也

空空如也

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

TA关注的人

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