自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Dubbo源码解析之服务发现

1.从配置入手xml形式引入一个dubbo服务配置如下:<dubbo:reference id="demoService" interface="com.doubeier.dubbo.common.infterface.DemoService" />根据之前所说内容,我们去DubboNamespaceHandler中查看该标签的解析情况:registerBeanDefinitionParser("reference", new DubboBeanDefinitionParse

2020-09-24 12:22:20 541

原创 SpringBoot源码解析-@SpringBootApplication注解

对一个spring boot项目,其启动类上会加上这个注解,那这个注解是干嘛的呢?1.SpringBootApplication看一下注解的定义@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(

2020-09-24 12:21:46 200

原创 spring源码解析BeanDefinitionRegistryPostProcessor之ConfigurationClassPostProcessor

1.类定义/** * ConfigurationClassPostProcessor * BeanDefinitionRegistryPostProcessor bean定义注册器后处理器接口 * PriorityOrdered 用于排序 * ResourceLoaderAware 调用setResourceLoader设置ResourceLoader * BeanClassLoaderAware 调用setBeanClassLoader设置BeanClassLoader *

2020-09-24 12:21:28 354

原创 推荐一个在线画图工具-processon

传送门

2020-09-22 15:18:50 233

原创 Dubbo源码解析之服务暴露过程-4SPI机制之ExtensionLoader源码解析

1.Protocol对象生成1.1 Protocol接口源码@SPI("dubbo")public interface Protocol { int getDefaultPort(); @Adaptive <T> Exporter<T> export(Invoker<T> invoker) throws RpcException; @Adaptive <T> Invoker<T> refer

2020-09-15 12:31:36 167

原创 Dubbo源码解析之服务暴露过程-3服务暴露-远程暴露

1.registryURLs处理接着上节本地服务暴露过程,我们继续看下面的代码 if (!Constants.SCOPE_NONE.toString().equalsIgnoreCase(scope)) { // export to local if the config is not remote (export to remote only when config is remote) if (!Constants.SCOPE_R

2020-09-15 12:31:16 377

原创 Dubbo源码解析之服务暴露过程-2服务暴露-本地暴露

1.export从上文可知,服务暴露是在ServiceBean类中的export方法进行的,其代码如下: /** * @since 2.6.5 * 服务暴露 */ @Override public void export() { //调用父类export方法 super.export(); // Publish ServiceBeanExportedEvent //发布暴露事件

2020-09-09 12:31:23 227

原创 Dubbo源码解析之服务暴露过程-1service标签解析与对应Bean的初始化

1.标签解析之前我们已经介绍过spring对自定义标签的解析方法,当时是以Dubbo为例的,这里就不再详细说明,Dubbo的service标签解析是通过DubboBeanDefinitionParser的parse方法来完成的。而service标签解析时,DubboBeanDefinitionParser对象的生成方式如下: //service标签处理 服务暴露 registerBeanDefinitionParser("service", new DubboBea

2020-09-09 12:29:50 414

原创 Java多线程深入学习-使用LockSupport完成线程交替打印

/** * 线程交替打印问题 使用LockSupport处理 */public class Demo_Thread_1a2b_LockSupport { static Thread t1,t2 ; public static void main(String[] args) { char[] c1 = "123456789".toCharArray(); char[] c2 = "ABCDEFGHI".toCharArray(); .

2020-09-07 12:24:35 251

原创 Java多线程深入学习-CountDownLatch源码解析

其内部就是用一个实现AQS的同步器进行处理,重写了tryAcquireShared和tryReleaseShared方法,这里就直接上源码吧/** * 一种同步辅助工具,允许一个或多个线程等待其他线程中正在执行的一组操作完成 * @since 1.5 * @author Doug Lea */public class CountDownLatch { /** * 定义静态内部类(同步器)继承AQS */ private static final class

2020-09-07 12:24:13 78

原创 spring 源码总结3之BeanDefinitionRegistry

1.BeanDefinitionRegistryBeanDefinitionRegistry是定义一个BeanDefinition注册器的接口,具体的BeanDefinition就是通过这个接口注册进spring容器中的,其源码如下:/** * BeanDefinition的注册接口,用于保存bean定义的注册表,例如RootBeanDefinition 和ChildBeanDefinition实例。 * 通常由BeanFactory实现在内部使用AbstractBeanDefinition层

2020-09-07 12:23:52 339

原创 spring 源码总结2之BeanDefinitionReader

1.BeanDefinitionReaderBeanDefinitionReader定义了一个读取BeanDefinition的接口,用于读取配置产生BeanDefinition,结合BeanDefinitionRegistry将对应的BeanDefinition放入spring容器中。其接口定义如下:/** * bean定义读取器的简单接口 使用资源和字符串位置参数指定加载方法 * 具体的bean定义读取器当然可以为bean定义添加额外的load和register方法,具体到bean定义格

2020-09-07 12:23:44 595

原创 spring 源码总结1之BeanDefinition

1. BeanDefinitionBeanDefinition字面翻译过来就是"Bean定义",spring容器启动的时候会对每个配置的bean生成一个BeanDefinition,其中包含很多信息,有BeanClassName,Scope,ParentName,LazyInit,DependsOn,AutowireCandidate,Primary,FactoryBeanName,FactoryMethodName,ConstructorArgumentValues,PropertyValues,In

2020-09-07 12:23:30 232

原创 spring解析自定义配置之spring.handlers/spring.schemas 以Dubbo为例2

之前说过spring解析自定义配置之spring.handlers/spring.schemas,来解析一些自定义标签,是以dubbo为例说明的。dubbo中的spring.handlers文件中定义了DubboNamespaceHandler类,其代码如下,spring容器启动时,会调用其init方法加载对应的标签解析器。public class DubboNamespaceHandler extends NamespaceHandlerSupport { static {

2020-09-07 12:22:53 242

原创 Mybatis源码解析-3通过SqlSession进行查询操作

1.查询操作SqlSession中定义的查询有以下这些: <T> T selectOne(String statement); <T> T selectOne(String statement, Object parameter); <E> List<E> selectList(String statement); <E> List<E> selectList(String statement, Objec

2020-08-22 12:11:28 689

原创 spring解析自定义配置之spring.handlers/spring.schemas 以Dubbo为例

1.发现问题1.1 由dubbo快速入门案例之服务端引发的思考provider.xml配置<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.or

2020-08-22 12:11:07 735

原创 spring 源码解析 AnnotationConfigApplicationContext方式启动容器

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);看看AnnotationConfigApplicationContext类的构造方法都干了什么 /** * 容器启动 传入配置类class数组 */ public AnnotationConfigApplicationContext(Class<?>... component.

2020-08-18 12:46:46 402

原创 Java多线程深入学习-ThreadLocal源码解析2.深入

1.Entry?弱引用?上一讲我们简单看了ThreadLocal的入门,了解到ThreadLocal是如何保证填充的变量是属于当前线程的。这里我们继续分析ThreadLocal源码。上一讲我们最后看到了ThreadLocalMap类的定义,发现其中定义了一个内部类Entry继承了WeakReference,代码如下: /** * Entry类继承WeakReference,这是一个弱引用 */ static class Entry

2020-08-17 12:58:37 160

原创 Mybatis源码解析-2通过SqlSessionFactory获取一个SqlSession

1.入口整个程序的demo在放一下: public static void main(String[] args) { //获取配置文件信息流 InputStream stream = Demo.class.getClassLoader().getResourceAsStream("mybatis.xml"); //使用SqlSessionFactory构建器,读取配置文件构建出一个sessionFactory SqlSessi

2020-08-17 12:57:59 1011

原创 推荐一个学习数据结构的网站-强大而好用

传送门

2020-08-14 09:56:57 813

原创 Java多线程深入学习-ThreadLocal源码解析1.入门

1.ThreadLocal是什么ThreadLocal是线程局部变量,意思是说,往ThreadLocal中填充的变量是属于当前线程的,该变量对于其他线程来说是隔离的。看其类定义:public class ThreadLocal<T> {}2.如何使用ThreadLocalThreadLocal的使用也非常简单,通过set方法填充值,通过get方法获取值,例如: ThreadLocal<String> local = new ThreadLocal<

2020-08-13 13:04:29 119

原创 基于Java代码的红黑树简单实现

直接上代码public class RedBlackTree<Key extends Comparable<Key>, Value> { /** 根节点 */ private Node root; /** 节点数 */ private int n; private static boolean RED = true; private static boolean BLACK = false; /** * 节点类定义 */ public

2020-08-13 12:29:26 200 1

原创 Java多线程深入学习-2.ThreadPoolExecutor线程池源码深入解析-提交任务与线程复用

1.submit与execute方法的区别//ExecutorService中定义 <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task);//Executor中定义 void execute(Runnable co

2020-08-12 08:45:37 165

原创 spring refresh()方法详解7之finishBeanFactoryInitialization(beanFactory) 之getBean(beanName)

/** * 根据beanName获取bean */ @Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }doGetBean

2020-08-10 14:28:14 162

原创 spring refresh()方法详解6之finishBeanFactoryInitialization(beanFactory)

/** * 初始化所有非懒加载的单例bean */ protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 1.初始化此上下文的转换服务 if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSIO..

2020-08-09 16:22:02 184

原创 spring refresh()方法详解5 之registerBeanPostProcessors(beanFactory)

/** * 注册BeanPostProcessor */ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { //注册BeanPostProcessor PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }继续向下 /** * 注册所有..

2020-08-09 16:21:27 273

原创 spring refresh()方法详解4之invokeBeanFactoryPostProcessors(beanFactory)

/** * 本方法会实例化和调用所有 BeanFactoryPostProcessor(包括其子类 BeanDefinitionRegistryPostProcessor) * BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 * BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。 * * BeanDefin..

2020-08-09 16:20:56 183

原创 spring refresh()方法详解3之prepareBeanFactory(beanFactory)

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 设置类加载器:存在则直接设置/不存在则新建一个默认类加载器 beanFactory.setBeanClassLoader(getClassLoader()); //设置EL表达式解析器(Bean初始化完成后填充属性时会用到) beanFactory.setBeanExpressionResolver(new Standar..

2020-08-09 16:20:02 264

原创 spring refresh()方法详解2之obtainFreshBeanFactory()

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { // 1.刷新 BeanFactory --具体实现见AbstractRefreshableApplicationContext refreshBeanFactory(); // 2.返回刷新后的 BeanFactory return getBeanFactory(); }1.1 refreshBeanFactory方法 /**..

2020-08-09 16:16:20 319

原创 spring refresh()方法详解1之prepareRefresh()

1.方法代码如下: /** * 准备工作 */ protected void prepareRefresh() { //记录初始化开始时间 this.startupDate = System.currentTimeMillis(); this.closed.set(false); //context是否关闭的标志,设置为false this.active.set(true); //context是否激活的标志,设置为true if (logger.isDebugEnab

2020-08-09 16:15:23 681

原创 spring ioc源码解析0解析入口-基于ClassPathXmlApplicationContext读取配置文件方式

1.入口 public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); }2.ClassPathXmlApplicationContext类图分析一下:3.详细解析 /** * 读取一个配置文件的构造方法 */ public ClassPathXmlApplicatio

2020-08-09 16:13:25 180

原创 Java多线程深入学习-线程池相关基础Executor,ExecutorService与AbstractExecutorService

1.Executor接口/** * 定义接口Executor */public interface Executor { /** * 定义一个接收Runnable对象的方法executor,该方法接收一个Runable实例,它用来执行一个任务, * 可以使用Executor而不用显示地创建线程:executor.execute(new RunnableTask()); */ void execute(Runnable command);}2.ExecutorSer

2020-08-09 16:12:35 144

原创 Java多线程深入学习-1.ThreadPoolExecutor线程池源码简单解析

1.类定义/** * 定义ThreadPoolExecutor线程池类 */public class ThreadPoolExecutor extends AbstractExecutorService { /** 线程池内部状态清况 */ //其中AtomicInteger变量ctl的功能非常强大:利用低29位表示线程池中线程数,通过高3位表示线程池的运行状态 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUN

2020-08-09 16:12:15 117

原创 Mybatis源码解析-1读取配置构建SqlSessionFactory

1.入口 public static void main(String[] args) { //获取配置文件信息流 InputStream stream = Demo.class.getClassLoader().getResourceAsStream("mybatis.xml"); //使用SqlSessionFactory构建器,读取配置文件构建出一个sessionFactory SqlSessionFactory sessio

2020-08-09 16:11:11 275

原创 Java多线程深入学习-Lock,ReadWriteLock,Condition接口定义

1.Lock接口/** * 定义锁接口 * 接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁重排算法)中使用这些规则。 * 主要的实现是 ReentrantLock。 */public interface Lock { /*在Lock中声明了四个方法来获取锁,那么这四个方法有何区别呢? * 首先,lock()方法是平常使用得最多的一个方法,就是用来获取锁。 * 如果锁已被其他线程获取,则进行等待。 * 在前

2020-08-02 12:53:45 111

原创 Java多线程深入学习-ReentrantLock源码解析

1.类定义/** * 基于AQS的可重入锁 可定义公平与非公平 */public class ReentrantLock implements Lock, java.io.Serializable {}1.1 Lock接口/** * 定义锁接口 * 接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁重排算法)中使用这些规则。 * 主要的实现是 ReentrantLock。 */public interfa

2020-08-02 12:38:18 130

原创 Java多线程深入学习-AbstractQueuedSynchronizer框架源码解析

AbstractQueuedSynchronizer AbstractQueuedSynchronizer为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁定和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。子类必须定义更改此状态的受保护方法,并定义哪种状态对于此对象意味着被获取或被释放。假定这些条件之后,此类中的其他方法就可以实现所有排队和阻塞机制。但只是为了获得同步而只追踪使用 getState()、setSt...

2020-08-02 00:28:21 289

原创 Java多线程深入学习-FutureTask与Callable实现解析

Callable接口定义/** * 定义一个函数式接口Callable */@FunctionalInterfacepublic interface Callable<V> { /** * 定义一个call方法 */ V call() throws Exception;}Future接口定义/** * 调用不带参数的get方法的调用被阻塞,直到计算完成。 * 如果在计算完成之前,调用带参get()方法超时时,会抛出Timeou

2020-06-14 17:40:14 207

原创 Java多线程深入学习-Unsafe类的介绍

老规矩,直接源码--/** * Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,一旦能够直接操作内存,这也就意味着 * (1)不受jvm管理,也就意味着无法被GC,需要我们手动GC,稍有不慎就会出现内存泄漏。 * (2)Unsafe的不少方法中必须提供原始地址(内存地址)和被替换对象的地址,偏移量要自己计算, * 一旦出现问题就是JVM崩溃级别的异常,会导致整个JVM实例崩溃,表现为应用程序直接crash掉。 * (3)直接操作内存,也意味着其速度更快,在高并发的条件

2020-06-14 17:39:30 188

原创 Java多线程深入学习-atomic原子类实现-AtomicIntegerFieldUpdater源码分析

/** * 定义抽象类AtomicIntegerFieldUpdater * 基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。 * 此类用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制。 */public abstract class AtomicIntegerFieldUpdater<T> { @CallerSensitive public static <U> AtomicIntegerFieldUp.

2020-06-14 15:36:35 176

空空如也

空空如也

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

TA关注的人

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