自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Dubbo源码深度解析(七)

核心就是ReferenceAnnotationBeanPostProcessor类,最终会生成一个对应的ReferenceBean对象,并放入Spring容器,当然最终给属性进行依赖注入的并非ReferenceBean对象,而是它的 ref属性,如果该属性为空,就需要调用Protocol#refer()方法(Dubbo的SPI机制找到Protocol接口的实现类,调用实现类的ref()方法)创建Invoker,最终生成代理对象还没讲到,这篇博客会讲到。到这里为止,生成Invoker对象的逻辑讲完了。

2024-08-21 03:06:57 647

原创 Dubbo源码深度解析(六)

同时也讲了服务消费方的调用链路,这块还是比较复杂的。由前面可知,在Protocol$Adaptive#refer()方法中,由于传入的URL的协议是"dubbo",因此extension对象实际上是ProtocolFilterWrapper对象,而ProtocolFilterWrapper对象的protocol属性是ProtocolListenerWrapper对象,而ProtocolListenerWrapper对象的protocol属性是DubboProtocol对象。

2024-08-19 02:55:15 781

原创 Dubbo源码深度解析(五)

因此到这里为止,可以知道,调用Protocol$Adaptive#export()方法,传入的Invoker对象为RegistryProtocol.InvokerDelegate对象,而RegistryProtocol.InvokerDelegate对象invoker是DelegateProviderMetaDataInvoker对象,而DelegateProviderMetaDataInvoker对象的invoker属性为抽象类AbstractProxyInvoker的匿名实现类。最后得到结果,返回。

2024-08-14 17:46:40 905

原创 Dubbo源码深度解析(四)

因此,调用PROXY_FACTORY#getInvoker()方法,实际上是调用ProxyFactory$Adaptive#getInvoker()方法,如果传入的url中,proxy属性(可以在@DubboService注解上指定)不为空,则获取属性值,如果为空,则用默认的值"javassist",最终调用。这块就是Netty Server启动的核心,也是固定写法,任何一个框架,使用Netty作为其通讯框架,大概都是这样写,没什么好讲的,如果对 Netty框架感兴趣,不妨看我写的这篇博客《

2024-08-12 18:17:09 599

原创 Dubbo源码深度解析(三)

针对group、version,是可以起到隔离服务的作用的,比如version,如果服务提供方有多个结点的话,可以在服务消费方指定version,服务消费反感发起请求,就会@DubboReference上配置的version找对应的节点,如果找到的节点有多个的话,则会通过负载均衡找到一个节点。因此可以知道,如果不设置scope,则会暴露对外两个地址,一个是本地(测试用,无需调用远程服务),使用的是"injvm"协议;虽然是报500,原因是我断点导致的超时,不打断点正常调用,是没问题的。

2024-08-07 18:02:54 621

原创 Dubbo源码深度解析(二)

可知,ExtensionLoader有一个EXTENSION_LOADERS,用作缓存,如果通过传入的Class获取不到,则创建一个对象ExtensionLoader,调用其有参构造方法,传入Class,在这里,Class也就是FrameworkExt.class,并将创建好的ExtensionLoader放入EXTENSION_LOADERS,方便下次直接获取。而后一个则是通过Dubbo的SPI机制寻找依赖的对象。这些Setter方法也不一定都会被调用,只有获取到了相应的对象,才会通过反射,进行赋值。

2024-08-04 17:04:24 917

原创 Dubbo源码深度解析(一)

本博客讲的是Dubbo源码,将分为几篇,本篇主要聊的是Dubbo如何跟SpringBoot整合,以及Dubbo中提供的一些注解的作用,还包括相关配置信息的读取以及绑定等。

2024-07-31 03:12:15 972

原创 SpringBoot源码深度解析

其中,DeferredImportSelector接口很重要,根据这个接口的特点:当Spring在解析配置类的时候,当解析完这一轮配置类后,才回调用DeferredImportSelector#selectImports()方法,由于有着一个延迟解析的特点,才能实现这样一个功能:比如Servlet容器有很多种,如Tomcat、Jetty、Undertow等,默认使用Tomcat作为Servlet容器,如果此时开发人员不想用Tomcat,想用Jetty,那应该怎么做呢?如果有多个配置类,就用","隔开。

2024-07-21 22:35:09 1386 6

原创 SpringMVC源码深度解析(下)

在WebMvcConfigurationSupport中,比如创建HandlerMapping对象的时候,就会调用到WebMvcConfigurationSupport#getInterceptors()方法,进而调用到DelegatingWebMvcConfiguration#addInterceptors()方法,传入InterceptorRegistry对象,实际上就是进行拦截器的设置,最终会将自定义的拦截器设置到InterceptorRegistry对象中。由上面的代码可知:如果有异常,但是。

2024-07-19 15:43:20 1496

原创 SpringMVC源码深度解析(中)

由于返回的是对象,因此需要处理,由于HelloController上添加的是@RestController,这个注解相当于@Controller+@ResponseBody,因此最终讲返回的对象反序列化为Json格式的数据,并返回给前端。当然,除了这个之外,常用的是在请求体中会放入Json数据,最后参数中接受的是一个对象,SpringMVC是怎么对Json格式的数据进行处理的呢?这三种情况的类,都属于Controller,因此需要不同的适配器处理,我主要讲①,剩下的两种,有兴趣可以试试。

2024-07-18 17:14:37 1104

原创 SpringMVC源码深度解析(上)

并调用AbstractDispatcherServletInitializer#getServletApplicationContextInitializers()方法(该方法为抽象方法,在子类中实现,我在MyWebApplicationInitializer中实现了),返回的是ApplicationContextInitializer的集合,并将其设置到DispatcherServlet对象中的 contextInitializers属性中,这是SpringMVC的扩展点。

2024-07-15 17:33:15 999

原创 Mybatis整合Spring事务原理&Druid连接池原理

当然,除此之外,还要添加@EnableTransactionManagement注解,这个注解的作用其实也最终也是往Spring容器中添加一个Advisor,即 BeanFactoryTransactionAttributeSourceAdvisor,以及一个 MethodInterceptor对象,即 TransactionInterceptor。),进而获取到Connection对象,因为Spring将这个Connection对象的 autoCommit设置成了false。

2024-07-04 12:52:17 907

原创 Mybatis源码深度解析

到这里为止,扫描到的Mapper接口被成功加入到了Spring容器,只不过真正的生成的对象是MapperFactoryBean罢了,并且对mapper接口中的注解扫描也完成的,被上述注解修饰的方法,会生成一个MappedStatement,缓存起来,想要获取MappedStatement,通过Mapper接口的全限定名+"."+方法名就可以获取到,如果Mapper接口中有两个重载方法会报错!真正调用具体方法的实惠,会先判断查询方法的返回值,返回的是返回的是Map呢?

2024-07-02 03:15:19 788

原创 Spring源码深度解析(下)

然后在寻找注入点的时候发现了A类依赖B类,这时候会调用getBean()方法,传入B类的beanName去尝试获取B对象,由于此时B还没有被实例化,因此同A一样,会进行B类的实例化以及初始化,在此之前,也会将B的beanName放入一个Set属性中表示当前对象正在被创建,然后也会将一段λ表达式放入三级缓存中(包括早期的B对象)。要解决构造方法的循环依赖也有办法,就是通过@Lazy注解就可以搞定,因为根据前面讲的,如果属性被@Lazy注解修饰,Spring会生成一个代理对象进行注入,因此这样是没问题的。

2024-07-01 17:31:49 895

原创 Spring源码深度解析(中)

接着上一篇博客Spring源码深度解析(上)继续往下讲。11.调用AbstractApplicationContext#finishBeanFactoryInitialization()方法,在该方法中,会提前初始化单例非懒加载的Bean,代码较长,我只截取关键的代码: 通过上面截取的代码可以知道,在创建Bean之前会先获取 beanName的集合,进行遍历,调用DefaultListableBeanFactory#getMergedLocalBeanDefi

2024-06-28 10:15:41 789

原创 Spring源码深度解析(上)

针对Bean,如果没有显式声明的话,默认都是单例的,这不符合Spring的设计思想,因此,第二种情况必须处理,这也是BeanMethodInterceptor#intercept()方法干的事,如果是直接方法调用,会先进到intercept()方法中,先判断该被依赖的对象那个是否已经在Spring的IOC容器存在,如果存在了,直接获取到这个对象返回,如果没有,则调用这个方法,创建对象,在返回的该对象同时,也把这个创建的对象那个放到Spring的IOC容器中,后续就不会再创建该对象了。

2024-06-25 10:46:49 927

原创 Sentinel源码深度解析

在这里是断路器的实现逻辑,具体如下:首先拿到当前状态,判断currentState是否等于State.CLOSED,如果是,则表示断路器没有打开,请求可以直接通过。④ 如果计算出来的windowStart大于WindowWrap的windowStart,按道理说,不应该出现这种情况,这实际上是出现了"时钟回拨"的问题,表示Linux服务器的时间出现了问题,因为是通过获取Linux的当前时间,计算得来的windowStart,因此针对这种情况,直接新建一个WindowWrap对象并返回。

2024-02-20 17:02:59 591 1

原创 Java并发包下常用工具类源码深度解析

如果state部位0,说明有线程已经加锁了,拿到exclusiveOwnerThread属性,判断其是否是当前线程,如果是,则state+1,返回true,表示加锁成功。① 众所周知,阻塞、唤醒线程,都是 用户态和内核态的相互转换,因此比较耗性能,在 看ReentrantLock源码,的时候,他也不上上来就加锁,在调用LockSupport.park()方法之前其实尝试获取了几次锁,都是为了避免线程被阻塞,到最到没办到了,才会阻塞线程,我数了下,一共四次,尝试获取锁。

2024-02-05 17:13:16 1424 1

原创 ThreadPoolExecutor&ScheduledThreadPoolExecutor源码深度解析

① 如果没有设置 allowCoreThreadTimeOut,则该属性默认为false,则在ThreadPoolExecutor#getTask()方法中,如果此时线程池中worker的数量小于等于核心线程数的数量,则程序会阻塞在workQueue.take()这里,知道拿到Runnable对象,才会返回,并在while中执行Runnable#run()方法,执行完 ,再次进入ThreadPoolExecutor#getTask()方法中阻塞,直到有新的Runnable对象被放入阻塞队列中为止;

2024-02-04 23:03:16 1047 1

原创 Netty源码深度解析

最后做一个小的总结,下图是我在网上,充分说明了Netty框架的运行模式,它是基于Reactor模型的主从架构:需要创建两个线程组EventLoopGroup,即bossGroup和workerGroup,一般bossGroup设置的线程组中线程的数量为1(也可以设置>1,如果这样设置的话,就需要绑定其他的端口,设置几个,绑定几个端口),workerGroup设置的线程组是多个,不设置默认创建的线程数量为 CPU核心数×2。今天,聊一聊Netty源码。因此,Netty使用。

2024-02-03 02:08:44 1407 4

原创 Open Feign源码深度解析

带你深度解析Open Feign源码,熟悉其调用链路,核心代码全部贴出来,如果你有Spring源码的基础,或者熟练使用Spring,相信你在看过了该博客之后,也能很快掌握Open Feign的源码!

2024-01-31 18:01:26 1781 3

原创 Ribbon源码深度解析

③ 这样的话,整个链路就很清晰:我们在使用我们自己定义的RestTemplate的时候,只要加上@LoadBalanced注解,Spring就会拿到我们定义的RestTemplate对象,再从Spring容器中拿到LoadBalancerInterceptor对象,并且加到RestTemplate的成员属性interceptors中,最终LoadBalancerInterceptor就会实现客户端的负载均衡功能,当然最终的实现,是依赖于LoadBalancerClient类。

2024-01-31 09:19:58 1198 3

空空如也

空空如也

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

TA关注的人

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