- 博客(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
原创 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
原创 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关注的人