- 博客(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 631
原创 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 239
原创 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 259
原创 Eureka服务端源码分析(一)--- 服务端实例化
EnableEurekaServer注解导入了EurekaServerMarkerConfiguration@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EurekaServerMarkerConfiguration.class)public @interface EnableEurekaServer {}EurekaServerMarkerConfiguration仅仅创建了一
2021-08-12 17:15:21 227
原创 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 270
原创 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 157
原创 Dubbo消费方远程调用源码分析(一)
之前文章讲到了ReferenceBean的依赖注入,但没有看ReferenceBean的实例化,现在接着看到ReferenceAnnotationBeanPostProcessor的doGetInjectedBean方法 @Override protected Object doGetInjectedBean(Reference reference, Object bean, String beanName, Class<?> injectedType,
2021-08-04 17:51:02 324
原创 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 342
原创 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 283
原创 Dubbo服务暴露(一) ------ ServiceBean源码解析
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware, ApplicationEventPublisherAware {
2021-07-30 20:23:57 242
原创 ReferenceAnnotationBeanPostProcessor源码分析 ------ @Reference的依赖注入
继承了AnnotationInjectedBeanPostProcessor类,其中传入泛型Reference注解。着重来看下@Reference的依赖注入,主要逻辑在父类。实际上和Autowired的依赖注入是一样的。ReferenceBean的相关逻辑,后面再单独来看。public class ReferenceAnnotationBeanPostProcessor extends AnnotationInjectedBeanPostProcessor<Reference>
2021-07-28 19:45:22 1528
原创 ServiceAnnotationBeanPostProcessor源码分析
ServiceAnnotationBeanPostProcessor实现了BeanDefinitionRegistryPostProcessor接口public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware,ResourceLoaderAware, BeanClassLoaderAware { private final Logge
2021-07-28 11:45:39 513
原创 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 1050
原创 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 2012
原创 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 96
原创 ExecutorCompletionService源码解析
主要来看看FutureTask的done方法的运用。public class ExecutorCompletionService<V> implements CompletionService<V> { //执行任务的线程池 private final Executor executor; //用于调用AbstractExecutorService的newTaskFor方法,来实例化一个实现了RunnableFuture接口的对象 //如果executor
2021-07-25 13:51:19 193
原创 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 74
原创 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 71
原创 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 63
原创 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 51
原创 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 275
原创 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 307
原创 LinkedHashMap源码解析
先看到成员变量 //为了实现有序访问HashMap中的数据,使用一个额外双向链表来维护数据的顺序 //双向链表的头节点 transient LinkedHashMap.Entry<K,V> head; //双向链表的尾节点 transient LinkedHashMap.Entry<K,V> tail; //默认为false,可以构造函数设置 //为true时,被访问的数据会移动到双向链表的尾部 //为false时,则按照插入的
2021-06-11 17:33:32 136
原创 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 71
原创 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 204
原创 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 205
原创 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 100
原创 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 232
原创 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 199
原创 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 340
原创 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 176
原创 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 489 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 809
原创 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 810
原创 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 1082
原创 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 132
原创 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 112
原创 Mybatis源码 ------ MapperProxyFactory,sql解析,参数解析,结果映射
已经了解完了SqlSessionFactory的初始化,接着看他的openSession方法,获取到sqlSession对象。public SqlSession openSession() { //configuration.getDefaultExecutorType() //获取ExecutorType,默认为ExecutorType.SIMPLE,也可以在配置文件中自己配置 return openSessionFromDataSource(configuration.getDefau
2021-04-22 17:18:17 209
原创 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 375
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人