SpringBoot-基础

第一个SpringBoot程序

1. 创建方法

  • 可以在官网直接下载后, 导入idea开发

  • 直接使用idea创建一个springboot项目(一般开发直接在idea中创建)

2. 第一个程序

package com.wang.helloWorld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//本身就是Spring的一个组件!

//程序的主入口
@SpringBootApplication
public class HelloWorldApplication {

   public static void main(String[] args) {
      //SpringApplication
      SpringApplication.run(HelloWorldApplication.class, args);
   }

}

controller

package com.wang.helloWorld.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//自动装配
@RestController
public class HelloController {

    //接口: http://localhost:8080/hello
    @RequestMapping("/hello")
    public String Hello() {
        //调用业务, 接收前端的参数
        return "Hello, World!";
    }
}

注意

  • 代码要在和application同级的目录下建文件夹,否则会无法生效!

3. 修改port和banner

1. 修改port

在resource目录下的application.properties文件中

#更改项目的端口号
server.port=8081

2. 修改banner

在resource的目录下新建banner.txt, 放入直接喜欢的banner即可!

4. 原理初探

1. 自动配置

1. pom.xml

  • spring-boot-dependencies: 核心依赖在父工程中

  • 我们在写或引入一些springboot依赖的时候, 不需要指定版本, 就因为有这些版本仓库!

2. 启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
  • 启动器就是springboot的启动场景
  • 比如spring-boot-starter-web, 会帮我们自动导入web的所有依赖
  • springboot会将所有的功能场景, 变成一个个的启动器
  • 我们要使用什么功能, 就只需要找到对应的启动器即可

3. 主程序

package com.wang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//@SpringBootApplication : 标注这个类是一个springboot的应用, 启动类下的所有配置导入
@SpringBootApplication
public class Springboot01HelloworldApplication {

    public static void main(String[] args) {
        //将springboot应用启动
        SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }

}

注解

  • @SpringBootConfiguration : springboot的配置

    • @Configuration : spring配置类(用java注解配置, 不用xml)
    • @Component : 说明这也是一个spring组件
  • @EnableAutoConfiguration : 自动配置

    • @AutoConfigurationPackage : 自动配置包

      • @Import(AutoConfigurationPackage.Registrar.class) : 自动配置 包注册
    • @Import(AutoConfigurationImportSelector.class) : 自动配置导入选择

      • getCandidateCOnfiguration(annotationMetadata, attributes) : 获取候选的配置

        • protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
              List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
              Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
              return configurations;
          }
          

META-INF/spring.factories : 自动配置的核心文件

image-20200916142219311

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

所有的资源加载到配置类中

4. 原理图

SpringBoot自动配置原理

5. @ConditionalOnXXX

  • 核心注解, 这个注解是自动配置没有全部生效而需要导入对应的start才生效的原因!

  • @ConditionalOnXXX(XXX, XXX, ...) 括号中的条件都满足这个类才生效

  • XXX: Class, Property, ...

6. 结论

SpringBoot所有的自动配置都在启动类中扫描并加载

扫描了spring.factories, 所有的自动配置类都在这里面, 但不一定生效

要看判断条件是否成立(@ConditionalOnXXX), 只要导入了对应的starter(pom), 就有对应的启动器了

有了启动器, 我们自动配置就会生效, 然后就配置成功了

步骤:

  1. SpringBoot在启动的时候, 从类路径/META-INF/spring.factories 获取了指定的值
  2. 将这些自动配置的类导入容器, 自动配置类就会生效, 帮我们自动配置
  3. 以前我们需要手动配置的东西, 现在SpringBoot帮我们做了
  4. 整合JavaEE, 解决方案和自动配置的东西都在spring-boot-autoconfigure-版本号.RELEASE .jar这个包下
  5. 它会把所有需要导入的组件, 以类名的方式返回, 这些组件就会被添加到容器
  6. 容器中也会存在非常多的XXXAutoConfiguration的文件, 就是这些类会给容器中导入这个场景需要的所有组件, 并自动配置@Configuration (JavaConfig!)
  7. 有了自动配置类, 免去了我们手动配置类的麻烦

2. Spring主程序启动

1. SpringApplication类

这个类主要做了四件事情

  1. 推断应用的类型是普通的项目还是Web项目(Web项目会一直运行)

  2. 查找并加载所有可用初始化器 , 设置到initializers属性中

  3. 找出所有的应用程序监听器,设置到listeners属性中

  4. 推断并设置main方法的定义类,找到运行的主类

    • SpringApplication.run(主类.class, args);

2. run方法

SpringBoot-Run

核心是利用Java来配置 JavaConfig

其中的核心是@Configuration和@Bean

3. SpringBoot的理解

  • 自动装配
  • run方法
    • 判断是否为web项目
    • 找到运行的主类
    • 监听器
    • 主要还是SpringApplication类做的四件事
原文地址:https://www.cnblogs.com/wang-sky/p/13679777.html