springBoot的原理及配置文件的使用

1.springboot的自动装载原理初步理解:

  当我们创建了一个springboot项目,并引入了一个web的启动器,我们就可以使用springmvc的功能,但是我们并没有配置springmvc.xml/web.xml文件,它是怎么启动的呢?

2.springBoot是怎么管理依赖的:

打开pom.xml,我们可以看到一个父工程:
在这里插入图片描述
我们点进这个父工程里面,发现里面还有一个父工程:
在这里插入图片描述
我们进入到这个里面,发现里面全是依赖的坐标还有版本号等:
在这里插入图片描述
  这个里面就是springboot的版本控制中心(springboot的版本仲裁机制),里面包含了我们正常环境所需要的依赖,我们以后导入依赖就可以不用再写版本了,但是如果我们使用的依赖没有在这个里面,就需要正常的导入依赖。
  当springboot中帮我们导入的依赖版本不满足我们的需求时,我们可以更改它的默认版本:
在这里插入图片描述
在这里插入图片描述


启动器:
在这里插入图片描述
spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
spring-boot-starter-test: 帮我们导入了test模块正常运行所依赖的组件。
启动器的大致意思:
  就是springboot帮我们把所以场景所需要的环境都抽取出来,封装成了一个个的启动器,当我们需要使用什么场景,我们就只需要导入对应的启动器即可,他会把我们所需要的依赖,都会自动的导入进来。例如:我们需要使用redis,我们只需要导入spring-boot-starter-redis这个启动器就可以了。



自动装配

  当我们创建了一个全新的项目,会自动的帮我们生成一个类,里面有一个main方法,我们就可以启动项目了:
在这里插入图片描述
我们可以看到类的上边有一个注解:
  @SpringBootApplication:这个注解的意思就是标注这个注解的类,就是我们的启动类,springboot会运行这个启动类的main方法,启动我们的程序。


我们点进去看:
在这里插入图片描述
这里面有三个springboot为我们提供的新的注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {
    
    @Filter(
    type = FilterType.CUSTOM,
    classes = {
    
    TypeExcludeFilter.class}
),
@Filter(
    type = FilterType.CUSTOM,
    classes = {
    
    AutoConfigurationExcludeFilter.class}
)}
)

@ComponentScan注解:
  作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中,而这里是排除那些类,不让加载进ioc容器中,并没有指定包扫描的路径
@SpringBootConfiguration:
  作用:SpringBoot的配置类 ,并把该类加载进ioc容器中,标注在某个类上 , 表示这是一个SpringBoot的配置类;


@EnableAutoConfiguration:开启自动装配
  这个注解就是一个核心的注解,表示告诉springboot开启自动配置功能。
我们点进这个注解:
在这里插入图片描述
发现这个里面还有两个注解:
@AutoConfigurationPackage:自动导入配置包
这个注解里面还有一个注解
在这里插入图片描述
@Import:spring底层注解,向容器中导入组件
Registrar.class:表示把主程序类所在的包及子包下所有的类,扫描进spring容器中。
查看底层代码调试:
在这里插入图片描述
这也就是为什么我们要再主程序所在包或者所在包下建子包的原因


看完这个,我们再返回上一层查看。

在这里插入图片描述
这个注解就是把这个类加载进我们的spring容器中,里面我们可以找到一个方法:
在这里插入图片描述
这个方法又调用了另外的一个方法:
在这里插入图片描述
这个方法,又调用了LoadSpringFactories方法,点开这个方法:
在这里插入图片描述

这里面我们就可以看到一个文件,这个文件的所在目录:
spring-boot-autoconfigure这个包下,也就是自动配置包
在这里插入图片描述
我们打开这个文件:
在这里插入图片描述

发现里面配置了很多的全限定类名,发现他的命名格式都是xxxAutoconfiguration格式的,也就是xxx就是我们所需要的环境名。
我们找到一个我们熟悉的配置:
在这里插入图片描述
点开这个类:
在这里插入图片描述
这个类就是一个配置类,上边有很多的注解,这些注解就是判断什么时候加载这个配置类。


@ConditionalOnBean:当容器中有指定的Bean的条件下  
@ConditionalOnClass:当类路径下有指定的类的条件下  
@ConditionalOnExpression:基于SpEL表达式作为判断条件  
@ConditionalOnJava:基于JVM版本作为判断条件  
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置  
@ConditionalOnMissingBean:当容器中没有指定Bean的情况下  
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下  
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下  
@ConditionalOnProperty:指定的属性是否有指定的值  
@ConditionalOnResource:类路径下是否有指定的资源  
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean

如果满足条件,那么就会把这个配置类通过反射的形式,加载进我们的spring容器中,这样就是自动装配。

自己理解小结:
  springboot会自动的帮我们把我们所需要配置的文件都形成为了配置类的形式,并把这些配置类的全类名放入到了spring-boot-autoconfigure这个包下Meta-info/spring.factories文件中,当我们启动的时候,会去加载这个文件,通过反射的形式,把满足条件的配置类加载进我们的spring容器中,这样我们的环境就不用再配置了。
  可能这个条件和对应的启动器有关。
  参考自:狂神说笔记

摘录:

扫描二维码关注公众号,回复: 12385982 查看本文章

SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

总结:
• SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
• 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
• 生效的配置类就会给容器中装配很多组件
• 只要容器中有这些组件,相当于这些功能就有了
• 定制化配置
• 用户直接自己@Bean替换底层的组件
• 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

猜你喜欢

转载自blog.csdn.net/weixin_43431123/article/details/112704128