自定义博客皮肤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)
  • 收藏
  • 关注

原创 Ribbon源码 --- 服务列表的初始化和刷新

LoadBalancerAutoConfiguration //依赖注入RestTemplate @LoadBalanced @Autowired(required = false) private List<RestTemplate> restTemplates = Collections.emptyList(); @Autowired(required = false) private List<LoadBalancerRequestTransformer> tra

2021-08-18 17:19:02 614

原创 Eureka客户端源码分析

spring-cloud-netflix-eureka-client/2.2.9.RELEASE/spring-cloud-netflix-eureka-client-2.2.9.RELEASE-sources.jar!/META-INF/spring.factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.cloud.netflix.eureka.config.Eureka

2021-08-16 15:30:17 226

原创 Eureka服务端源码分析(二)--- 服务端处理客户端请求

ApplicationResource //服务注册 @POST @Consumes({"application/json", "application/xml"}) public Response addInstance(InstanceInfo info, @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication) { log

2021-08-13 14:57:54 248

原创 Eureka服务端源码分析(一)--- 服务端实例化

EnableEurekaServer注解导入了EurekaServerMarkerConfiguration@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EurekaServerMarkerConfiguration.class)public @interface EnableEurekaServer {}EurekaServerMarkerConfiguration仅仅创建了一

2021-08-12 17:15:21 215

原创 Dubbo服务提供方接收请求源码分析

有了前面多个文章的基础,直接看到Dubbo的各个handler //MultiMessageHandler @SuppressWarnings("unchecked") @Override public void received(Channel channel, Object message) throws RemotingException { //如果是MultiMessage,则循环所有message 进行调用 if (message insta

2021-08-06 17:24:56 238

原创 Dubbo消费方远程调用源码分析(二)

承接上文,接着看。FailoverClusterInvoker @Override @SuppressWarnings({"unchecked", "rawtypes"}) public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { List<Invok

2021-08-06 17:24:32 150

原创 Dubbo消费方远程调用源码分析(一)

之前文章讲到了ReferenceBean的依赖注入,但没有看ReferenceBean的实例化,现在接着看到ReferenceAnnotationBeanPostProcessor的doGetInjectedBean方法 @Override protected Object doGetInjectedBean(Reference reference, Object bean, String beanName, Class<?> injectedType,

2021-08-04 17:51:02 309

原创 Dubbo服务端更新 ------- OverrideListener源码分析

private class OverrideListener implements NotifyListener { private final URL subscribeUrl; private final Invoker originInvoker; public OverrideListener(URL subscribeUrl, Invoker originalInvoker) { this.subscribeUrl = s

2021-08-03 12:09:28 325

原创 Dubbo服务暴露(二)------ 服务启动,注册,监听

承接上文,没看完的部分接着看。ServiceConfig //SPI的源码之前已经看过了,直接看到生成的类的代码 //ProxyFactory$Adaptive private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); //Protocol$Adaptive private static fina

2021-08-02 17:13:00 272

原创 Dubbo服务暴露(一) ------ ServiceBean源码解析

public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware, ApplicationEventPublisherAware {

2021-07-30 20:23:57 227

原创 Dubbo SPI源码分析

123

2021-07-29 18:27:10 67

原创 ReferenceAnnotationBeanPostProcessor源码分析 ------ @Reference的依赖注入

继承了AnnotationInjectedBeanPostProcessor类,其中传入泛型Reference注解。着重来看下@Reference的依赖注入,主要逻辑在父类。实际上和Autowired的依赖注入是一样的。ReferenceBean的相关逻辑,后面再单独来看。public class ReferenceAnnotationBeanPostProcessor extends AnnotationInjectedBeanPostProcessor<Reference>

2021-07-28 19:45:22 1455

原创 ServiceAnnotationBeanPostProcessor源码分析

ServiceAnnotationBeanPostProcessor实现了BeanDefinitionRegistryPostProcessor接口public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware,ResourceLoaderAware, BeanClassLoaderAware { private final Logge

2021-07-28 11:45:39 500

原创 EnableDubbo注解解析(二)------ DubboComponentScan注解

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documented@EnableDubboConfig //读取配置文件 创建dubbo配置bean@DubboComponentScan //扫描 @Service(不是spring的sevice注解) @Reference 生成 beanpublic @interface EnableDubbo { @AliasFor(ann

2021-07-28 11:44:55 1031

原创 EnableDubbo注解解析(一)------ EnableDubboConfig注解

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documented@EnableDubboConfig //读取配置文件 创建dubbo配置bean@DubboComponentScan //扫描 @Service(不是spring的sevice注解) @Reference 生成 beanpublic @interface EnableDubbo { @AliasFor(ann

2021-07-27 17:08:54 1972

原创 ThreadLocal源码解析

hash值的计算。 //初始为0,静态变量。 private static AtomicInteger nextHashCode = new AtomicInteger(); /** * The difference between successively generated hash codes - turns * implicit sequential thread-local IDs into near-optimally spread * multiplic

2021-07-26 18:45:35 83

原创 ExecutorCompletionService源码解析

主要来看看FutureTask的done方法的运用。public class ExecutorCompletionService<V> implements CompletionService<V> { //执行任务的线程池 private final Executor executor; //用于调用AbstractExecutorService的newTaskFor方法,来实例化一个实现了RunnableFuture接口的对象 //如果executor

2021-07-25 13:51:19 183

原创 FutureTask源码解析

成员变量和常量 /** * The run state of this task, initially NEW. The run state * transitions to a terminal state only in methods set, * setException, and cancel. During completion, state may take on * transient values of COMPLETING (while ou

2021-07-25 13:32:30 63

原创 CopyOnWriteArrayList源码分析

成员变量 //用于存放数据的array,object类型 /** The array, accessed only via getArray/setArray. */ private transient volatile Object[] array; //锁 /** The lock protecting all mutators */ final transient ReentrantLock lock = new ReentrantLock();构造函数 //无

2021-07-19 18:03:09 58

原创 LinkedList源码分析

成员变量 //集合中数据个数 transient int size = 0; //头结点 transient Node<E> first; //尾节点 transient Node<E> last; //和ArrayList一样,对集合进行增加和删除数据 ,则会修改该值 protected transient int modCount = 0;数据被包装为Node private static class Node<

2021-07-03 14:44:17 58

原创 ArrayList源码分析

成员变量和常量//存储数据的数组transient Object[] elementData;//数据的个数private int size;//默认的容量private static final int DEFAULT_CAPACITY = 10;//空数组private static final Object[] EMPTY_ELEMENTDATA = {};//空数组private static final Object[] DEFAULTCAPACITY_EMPTY_EL

2021-07-03 11:43:48 45

原创 ConcurrentHashMap源码分析(二) ---- get方法和remove方法

有了前文的基础,直接看到get方法 public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek; //计算hash值 int h = spread(key.hashCode()); //如果table初始化过 且 根据hash定位到对应位置的table上有数据 if ((tab = table) != nu

2021-06-13 12:00:25 264

原创 ConcurrentHashMap源码分析(一) ---- 插入,扩容,计算总数据量

先看到部分成员变量和常量 //map中最大的容量 private static final int MAXIMUM_CAPACITY = 1 << 30; //默认的容量 private static final int DEFAULT_CAPACITY = 16; //默认的扩容因子 private static final float LOAD_FACTOR = 0.75f; //节点从链表升级为红黑树的阈值 static final int TREEIFY_

2021-06-13 11:32:56 294

原创 LinkedHashMap源码解析

先看到成员变量 //为了实现有序访问HashMap中的数据,使用一个额外双向链表来维护数据的顺序 //双向链表的头节点 transient LinkedHashMap.Entry<K,V> head; //双向链表的尾节点 transient LinkedHashMap.Entry<K,V> tail; //默认为false,可以构造函数设置 //为true时,被访问的数据会移动到双向链表的尾部 //为false时,则按照插入的

2021-06-11 17:33:32 124

原创 HashMap源码分析

先看到部分成员变量,常量 //存放数据的数组 transient Node<K,V>[] table; //entry的set集合 transient Set<Map.Entry<K,V>> entrySet; //HashMap中数据的个数 transient int size; //HashMap中数据被修改次数,比如插入删除数据 transient int modCount; //扩容阈值 int threshold; //扩容因子

2021-06-11 11:37:30 66

原创 ThreadPoolExecutor --- 线程池源码分析

首先看到ThreadPoolExecutor类中的一些成员变量 //ctl 初始为 RUNNING 且 线程池中没有线程 111+29个0 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //COUNT_BITS 32 - 3 = 29 private static final int COUNT_BITS = Integer.SIZE - 3; //线程池最大容量 前3位位0 后2

2021-05-30 19:12:15 192

原创 Semaphore源码解析

先看到Semaphore的构造方法 //该方法默认非公平锁 public Semaphore(int permits) { sync = new NonfairSync(permits); } public Semaphore(int permits, boolean fair) { sync = fair ? new FairSync(permits) : new NonfairSync(permits); }看到Semaphore的acqu

2021-05-28 19:10:10 200

原创 ReentrantReadWriteLock源码解析

先看到构造方法 public ReentrantReadWriteLock() { //无惨构造函数,默认非公平锁 this(false); } public ReentrantReadWriteLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); readerLock = new ReadLock(this); writerLock

2021-05-28 16:24:29 93

原创 ReentrantLock源码解析(二)----- 条件队列

直接看到aqs的ConditionObject类的await方法。 public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); //将当前线程包装为node,添加到条件队列中(现在节点是在条件等待队列中) Node no

2021-05-27 21:45:31 221

原创 ReentrantLock源码解析(一)----- lock和unlock方法

看到ReentrantLock构造方法 //无参构造函数为非公平锁 public ReentrantLock() { sync = new NonfairSync(); } //可以传递一个boolean变量来选择使用公平锁或非公平锁 public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }先看到lock方法

2021-05-27 16:15:03 193

原创 synchronized和锁对象

首先来看到对象头的MarkWord属性偏向锁写段代码,来查看偏向锁的锁对象头的属性import lombok.extern.slf4j.Slf4j;import org.openjdk.jol.info.ClassLayout;@Slf4j(topic = "test")public class MyTest { public static void main(String[] args) throws InterruptedException { //由于有偏向延迟,休眠

2021-05-24 18:28:22 327

原创 jvm-从字节码的执行理解操作数栈

  使用以下代码为例,来查看它的字节码文件。推荐使用idea使用jclasslib Bytecode Viewer插件更直观的查看字节码文件。public class Test { public static void main(String[] args) { Test test = new Test(); System.out.println(test.add(2,3)); } private Integer add(int a,int b)

2021-05-09 12:24:19 168

原创 Seata TCC模式源码解析

  前文已经讲解了AT模式的流程,现在接着看到TCC模式的源码。有了前面的基础,我们直接看到GlobalTransactionScanner类的wrapIfNecessary方法protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { try { synchronized (PROXYED_SET) { if (PROXYED_S

2021-04-30 17:30:19 475 1

原创 Seata AT模式源码解析(三) ------ 二阶段事务提交和回滚

  GlobalTransactionScanner 实现了InitializingBean接口,重写afterPropertiesSet方法完成了TM和RM的初始化,RM的初始化实例化了RmNettyRemotingClient 用于通信,其中TransactionMessageHandler属性接收到TC的提交,回滚的请求,并且响应结果给TC端。public class RMClient { /** * Init. * * @param applicationI

2021-04-29 17:42:45 800

原创 Seata AT模式源码解析(二) ------ DataSourceProxy

  由于seata需要兼容现有常用的ORM框架,所以直接使用DataSourceProxy实现DataSource接口,在项目中作为数据源对象。@Primary@Beanpublic DataSourceProxy dataSourceProxy(DataSource dataSource) { //持有了目标数据源对象,该DataSourceProxy构造函数,会把RootContext的DEFAULT_BRANCH_TYPE设置为BranchType.AT return new Data

2021-04-29 16:15:39 785

原创 Seata AT模式源码解析(一) ------ GlobalTransactionalInterceptor

  首先,需要自行了解AT模式的流程,然后要使用seata的话,在pom.xml添加以下内容。 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-seata</artifactId> <version>2.1.0.RELEASE</version> </

2021-04-29 10:06:24 1067

原创 Mybatis和Spring整合源码分析

  直接看到SqlSessionFactoryBean这个类,实现了FactoryBean和InitializingBean接口  FactoryBean接口:public SqlSessionFactory getObject() throws Exception { if (this.sqlSessionFactory == null) { afterPropertiesSet(); } //返回SqlSessionFactory的实例 return thi

2021-04-25 14:41:26 126

原创 Mybatis源码 ------ plugin详解

  首先看到plugins标签的解析 <plugins> <plugin interceptor="xxx.xx"> <property name="x" value="x"/> </plugin> </plugins>private void pluginElement(XNode parent) throws Exception { if (parent !=

2021-04-24 11:43:04 104

原创 Mybatis源码 ------ MapperProxyFactory,sql解析,参数解析,结果映射

  已经了解完了SqlSessionFactory的初始化,接着看他的openSession方法,获取到sqlSession对象。public SqlSession openSession() { //configuration.getDefaultExecutorType() //获取ExecutorType,默认为ExecutorType.SIMPLE,也可以在配置文件中自己配置 return openSessionFromDataSource(configuration.getDefau

2021-04-22 17:18:17 200

原创 Mybatis源码 ------ xml配置文件解析

  在不整合spring的情况下,需要通过xml配置mybatis的各种属性,完成SqlSessionFactory初始化。public SqlSessionFactory getSqlSessionFactory() { InputStream inputStream; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); } catch (

2021-04-20 15:29:58 368

空空如也

空空如也

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

TA关注的人

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