加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

SpringBoot-基础

发布时间:2020-12-15 01:16:17 所属栏目:大数据 来源:网络整理
导读:第一个SpringBoot程序 目录 第一个SpringBoot程序 1. 创建方法 2. 第一个程序 3. 修改port和banner 1. 修改port 2. 修改banner 4. 原理初探 1. 自动配置 1. pom.xml 2. 启动器 3. 主程序 4. 原理图 5. @ConditionalOnXXX 6. 结论 2. Spring主程序启动 1. Spr

第一个SpringBoot程序

目录
  • 第一个SpringBoot程序
    • 1. 创建方法
    • 2. 第一个程序
    • 3. 修改port和banner
      • 1. 修改port
      • 2. 修改banner
    • 4. 原理初探
      • 1. 自动配置
        • 1. pom.xml
        • 2. 启动器
        • 3. 主程序
        • 4. 原理图
        • 5. @ConditionalOnXXX
        • 6. 结论
      • 2. Spring主程序启动
        • 1. SpringApplication类
        • 2. run方法
      • 3. 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类做的四件事

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读