• 初识Springboot


    1. Springboot项目的构建方式

    1.1 通过官网自动生成

    https://start.spring.io/ 自动生成

    1.2 IDEA通过maven项目构建

    a.创建一个独立的maven项目

    b.引入对应依赖

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-parentartifactId>
    4. <version>2.1.15.RELEASEversion>
    5. <relativePath/>
    6. parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.bootgroupId>
    10. <artifactId>spring-boot-starter-webartifactId>
    11. dependency>
    12. dependencies>

    c. 添加对应的启动器

    1. @SpringBootApplication
    2. public class GpSpringBootApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(GpSpringBootApplication.class,args);
    5. }
    6. }

    d.启动启动器的主方法即可

    2.Springboot的常规配置

    2.1 入口类和相关注解

    1. @SpringBootApplication
    2. public class GpSpringbootDemo02Application {
    3. public static void main(String[] args) {
    4. // Spring IoC 容器的初始化
    5. ApplicationContext ac = SpringApplication.run(GpSpringbootDemo02Application.class, args);
    6. }
    7. }

     main方法: 其实完成的就是一个SpringIOC容器的初始化操作

    @SpringBootApplication注解

    • 在IOC初始化的时候会加载该注解
    • 是一个组合注解
    1. @Target({ElementType.TYPE}) // 注解可以写在哪些地方
    2. @Retention(RetentionPolicy.RUNTIME) // 该注解的作用域 RESOURCES CLASS RUNTIME
    3. @Documented // 该注解会被API抽取
    4. @Inherited // 可继承
    5. // 以上四个是Java中提供的元注解
    6. @SpringBootConfiguration // 本质上就是一个Configuration注解
    7. @EnableAutoConfiguration // 自动装配的注解
    8. @ComponentScan( // 扫描 会自动扫描 @SpringBootApplication所在的类的同级包(com.gupaoedu)以及子包中的Bean,所有一般我们建议将入口类放置在 groupId+artifcatID的组合包下
    9. excludeFilters = {@Filter(
    10. type = FilterType.CUSTOM,
    11. classes = {TypeExcludeFilter.class}
    12. ), @Filter(
    13. type = FilterType.CUSTOM,
    14. classes = {AutoConfigurationExcludeFilter.class}
    15. )}
    16. )

    2.2 常规配置

    在Spring Boot中给我们提供的有两个配置文件 applicationContext.properties,applicationContext.yml作用是一样的,一个项目中只需要其中的一个就可以了。

    自定义属性

    # 自定义的配置信息
    user.username=bobo
    user.age=18
    user.address=湖南长沙

     获取

    1. @Value("${user.username}")
    2. private String userName;
    3. @Value("${user.age}")
    4. private Integer age;
    5. @Value("${user.address}")
    6. private String address;

    2.3 logback日志

    Spring Boot内置的有Logback的依赖

    直接在属性文件中简单配置

    1. # logback的配置
    2. logging.file=d:/log.log
    3. logging.level.org.springframework.web=DEBUG

    或者单独提供一个logback.xml 

    2.4 Profile

    命名规则 application-xxx.properties

    spring.profiles.active=xxx # 指定对应的环境

    3.Springboot的静态资源

    3.1 static目录

    SpringBootmore的存放静态资源的目录

    3.2 webapp目录

    在resources统计目录下创建一个webapp目录,该目录的类型必须是ResourcesRoot

    3.3 自定义静态资源路径

    自定义目录后,创建对应的相关资源,然后在属性文件中去覆盖静态资源的路径配置即可

    1. # 表示所有的访问都经过静态资源路径
    2. spring.webflux.static-path-pattern=/**
    3. # 覆盖默认的配置,所有需要将默认的static public等这些路径将不能作为静态资源的访问
    4. spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/custom

    4.自动装配的原理

    @EnableAutoConfiguration

    1. @Target({ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Inherited
    5. @AutoConfigurationPackage
    6. @Import({AutoConfigurationImportSelector.class})
    7. public @interface EnableAutoConfiguration {
    8. String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    9. Class[] exclude() default {};
    10. String[] excludeName() default {};
    11. }

    通过@EableAutoConfiguration注解发现。其本身就是一个组合注解,有一个注解我们必须要先弄清除@Import注解,可参考博客Spring之IOC-CSDN博客

     4.1 原理分析

    1. public String[] selectImports(AnnotationMetadata annotationMetadata) {
    2. if (!this.isEnabled(annotationMetadata)) {
    3. return NO_IMPORTS;
    4. } else {
    5. // 加载META-INF/spring-autoconfigure-metadata.properties
    6. AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
    7. AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
    8. // 返回需要IoC加载的类型数组
    9. return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    10. }
    11. }
    1. protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
    2. if (!this.isEnabled(annotationMetadata)) {
    3. return EMPTY_ENTRY;
    4. } else {
    5. AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
    6. // 获取候选的配置信息 META-INF/spring.factories 加载了很多的 类路径
    7. List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
    8. // 去掉重复的
    9. configurations = this.removeDuplicates(configurations);
    10. // 去掉要排除掉的类型
    11. Set exclusions = this.getExclusions(annotationMetadata, attributes);
    12. this.checkExcludedClasses(configurations, exclusions);
    13. configurations.removeAll(exclusions);
    14. // 过滤器
    15. configurations = this.filter(configurations, autoConfigurationMetadata);
    16. // 广播
    17. this.fireAutoConfigurationImportEvents(configurations, exclusions);
    18. return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    19. }
    20. }

     其启动的流程:

    1.在SpringBoot项目启动的时候,会加载SpringBootApplication这个注解

    2.会解析@EnableAutoConfiguration注解

    3.与之对应的解析@Import注解

    4.执行ImportSelector接口的的实现

    5.加载META-INF/spring-autoconfigure-metadata.properties中的注解元数据信息

    6.加载META-INF/spring.factories各种类路径【第三方扩展也同样的会加载对应的文件 SPI扩展机制】

  • 相关阅读:
    Go:日志滚动(rolling)记录器 lumberjack 简介
    在服务中无法正常启动Nacos
    贴近摄影测量 | 中国最神秘的建筑!
    Python web 框架web.py「简约美」
    C++文件服务器项目—Redis—2
    【计算机网络】 心跳机制
    从零开始的PICO教程(1)Pico游戏开发项目配置
    使用数学的力量来简化多级比较
    keycloak~时间不正确的问题
    探索网络世界:常见应用程序详解与实战演练
  • 原文地址:https://blog.csdn.net/still_five_Days/article/details/139455620