Spring源码分析(2)-DI 依赖注入过程分析
DI 注入时序图整个注入过程可以分成 2 个阶段
实例化:创建对应的 bean
依赖注入:将 bean 的相关依赖注入到实例中
入口分析
如果没有设置 lazy-init=false,那么 spring 默认会在第一次调用 bean 的时候才初始化 bean,所以入口在 beanFatcory 接口的 getBean 方法中。
如果设置了 lazy-init=false,那么 spring 会在容器启动的时候直接初始化。在上一篇分析 IOC 初始化的时候,容器在初始化的时候都会调用 refresh 方法,在 refresh 方法中有一个 finishBeanFactoryInitialization 方法,这个就是直接初始化 bean 的入口,而在 finishBeanFactoryInitialization 方法内部其实也是调用 BeanFactory 的 getBean 方法来生成 bean 的
源码分析调用 BeanFatory 的 getBean 方法->AbstractBeanFactory 的 getBean 方法的具体实现->调用 Abstr ...
Spring源码分析(1)-IOC容器初始化过程分析
首先给出 IOC 容器初始化的时序图这里以 ClassPathXmlApplicationContext 为例子,加载 xml 文件中的对象。
大致流程分为 3 个步骤,定位,加载,注册
定位:定位 xml 所在位置
加载:将 xml 中的元素转化成 Resource 对象,加载对应的节点元素
注册:将 Resource 对象转化成 Document 对象,然后注册到 BeanDifinittion,保存到容器 beanDefinitionMap 中
实际分析过程
首先我们在加载一个 xml 配置文件的时候,会使用以下方式,所以我们以 ClassPathXmlApplicationContext 这个容器作为示例
123public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml"); }
可以看出,我们是通过构造方 ...
SpringCloud-Gateway的使用
SpringCloud-gateway 的使用初步使用
引入依赖
gateway 是一个独立的 web 服务器,他使用的是 netty 的服务器,所以我们的项目不能包含 spring-boot-starter 依赖。为了避免被继承依赖,所以我们新建一个项目,自建依赖。
12345678910111213141516171819202122232425262728293031323334353637<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
SpringCloud-Eureka的使用
Eureka 的使用单机版 Eureka 注册中心注册中心
新建一个 spring-cloud-eureka 项目,用作注册中心
引入依赖
12345678910111213141516171819202122232425262728293031323334353637 <properties> <java.version>11</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.0.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR4</spring ...
SpringCloud-Config的使用
Config 的使用Config Server
创建 git 项目,创建一级目录 config(可以不创建,这里是为了区分路径)。增加配置文件
order-service-dev.yml
order-service-test.yml
order-service.yml
order-service 为使用 config 客户端的项目名称,后缀为 profile-环境
1234567891011121314order-service.ymldev: prodorderId: bbbborder-service-dev.ymlenv: devorderId: aaaaorder-service-test.ymlenv: testorderId: ccc
引入依赖
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId></dependency>
...
SpringCloud-Openfegin 源码分析
Openfegin 源码分析在使用 fegin 的过程中,最重要的一点就是在 application 中增加@EnableFeignClients,来启用 feign。
我们来看看这个注解的声明。
1234567@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients { ...}
在这个注解中,主要是通过 import 动态装载了 FeignClientsRegistrar 类,这个就是 spring 的动态装载 registrar 的实现,我们来看看 FeignClientsRegistrar 的具体实现
123456@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) & ...
集合源码分析-线程安全的list
Vector 与 ArryaList 的差异
增加了一个可以控制扩容增量的构造方法
12345678public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement;}
修改了默认扩容机制
123456789101112private void grow(int minCapacity) { // overf ...
集合源码分析-List
集合继承关系图
属性12345678910111213141516171819202122232425262728293031323334353637/** * Default initial capacity. * 容器默认大小 */private static final int DEFAULT_CAPACITY = 10;/** * Shared empty array instance used for empty instances. * 当数组的长度被指定为0的时候,elementData使用当前属性 * 有参构造方法,在长度为0 的时候,指向当前数组 */private static final Object[] EMPTY_ELEMENTDATA = {};/** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate ...
SpringCloud-OpenFegin的使用
OpenFegin 的使用自定义接口
引入 jar 包
12345<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.3.RELEASE</version></dependency>
增加注解,在 application 增加注解@@EnableFeignClients,启用 feign
配置服务地址
123# 配置指定服务的提供者的地址列表order-service.ribbon.listOfServers=\ localhost:8188
因为是继续 ribbon 的学习,所以会使用一些 ribbon 的配置。
创建接口
123456@FeignClient("spring-cloud-order-service")public interface Or ...
Springboot-整合Ribbon
SpringBoot 整合 Ribbon使用 LoadBalanceClient
引入 jar 包
12345 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.3.RELEASE</version></dependency>
注意 springboot 版本和 jar 包版本差异问题
配置负载
12spring-cloud-order.ribbon.listOfServers=\ localhost:8180,localhost:8181
业务使用
1234567891011121314151617181920212223242526@RestControllerpublic class TestController { @Aut ...