SpringBoot 源码透彻解析——必须提前了解的几个知识点(这些玩意充斥到springboot源码的各个角落)
- SpringFactoriesLoader.loadFactories(ApplicationContextFactory.class,getClass().getClassLoader() : 根据 spring.factories文件,获取实现类的实例;
- Binder.get(environment).bind(“spring.main”, Bindable.ofInstance(this)); 绑定配置文件属性到相关类实例;
- BeanDefinitionRegistry 用来将beanDefinition注册到容器(还没生成bean);
- RootBeanDefinition ChildBeanDefinition GenericBeanDefinition的作用 ;
spring.factories : 用来记录需要自动装配的配置类;
spring-autoconfigure-metadata.properties:用来记录配置类的装配条件(ConditionOnClass, ConditionOnBean等等)注意1:这里有一个细节,在spring-autoconfigure-metadata.properties里面写Condition等条件等 同于在配置类上写, 并且启动快; 注意2:@ConditionOnClass(XXX.class)用在类上安全(判断时是加载的class原文件进行ASM技术解析文件)而用在方法上是不安全的,如果不存在类会报错 sun.reflect.annotation.TypeNotPresentExceptionProxy,所以这个注解只放在类上或者放在方法上用name属性@ConditionOnClass(name="org.example.user");
- idea里面 Properties指的是提供了get/set方法的私有字段,Field指的是没有提供get/set方法的私有字段只在本类访问;
option和provided都表示依赖不传递;
optional 表示某个依赖可选,该依赖是否使用都不会影响服务运行。例子:吃面时候,酱油就是可选的,加不加都不会影响面的正常使用。 provided 表示某个依赖必须,不过该依赖通常是由系统或者容器提供,不提供会报错,不需要自己关系。例子:吃面时候,筷子、碗这样的东西都是必须的,不过这些一般是店家给顾客备好,不需要顾客自带。