SpringBoot学习笔记

一 概述与入门

Spring缺点
  • 配置繁琐
  • 依赖繁琐
SpringBoot功能
  • 自动配置
  • 起步依赖
  • 辅助功能,如内置服务器

SpringBoot提供了一种快速开发Spring项目的方式,不是对Spring功能上的增强

快速构建项目

下面通过 IDEA 来生成一个 Spring Boot 的项目

  1. File->New->Project->Spring Initializr
  2. 填写项目名称,选择路径、项目构建工具、jdk版本、打包方式,next
  3. 选择SpringBoot版本,添加需要的依赖,finish

二 配置

配置文件分类
  • properties

    server.port=8080
    
  • yml/yaml

    server:
      port: 8080
    

同一级目录下优先级:properties>yml>yaml

yaml
基本语法
  • 数据值前面必须有空格
  • 使用缩进表示层级关系
  • 缩进不能使用tab键,只能使用空格,空格数量不重要,相同层级的左侧对齐即可
  • #表示注释
数据格式
  • 对象:键值对的集合

    person:
      name: hhf
    #行内写法
    person1: {name: hhf}
    
  • 数组:一组按次序排列的值

    address:
      - shenzhen
      - beijing
    #行内写法
    address1: [shenzhen,beijing]
    
  • 纯量:单个、不可再分的值

    msg1: 'hello \n java' #单引号忽略转义字符
    msg2: "hello \n java" #双引号识别转义字符
    
参数引用
name: java
course:
  name: ${name}
读取配置文件内容
  • @Value

    @Value("${name}")
    private String name;
    
    @Value("${person.name}")
    private String personName;
    
    @Value("${address[0]}")
    private String address1;
    
    @Value("${msg1}")
    private String msg1;
    
  • Environment

    @Autowired
    private Environment env;
    //在方法中调用getProperty获取内容
    env.getProperty("person.name");
    
  • @ConfigurationProperties

    @Component
    //指定配置文件中的前缀
    @ConfigurationProperties(prefix = "person")
    public class Person {
        //成员变量名对应配置文件属性名
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    
    @Autowired
    private Person person;
    //在方法中调用getxxx获取内容
    person.getName();
    
    <!--pom.xml加入依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    
profile

动态配置切换不同环境(开发、测试、生产)

配置
  • 多profile文件方式

    开发环境配置:application-dev.properties

    测试环境配置:application-test.properties

    生产环境配置:application-pro.properties

    在application.properties:

    #dev为application-dev
    spring.profiles.active=dev
    
  • yml多文档方式

    #通过“---”分隔不同环境的配置
    ---
    server:
      port: 8081
    
    spring:
      config:
        activate:
          on-profile: dev
    ---
    server:
      port: 8082
    
    spring:
      config:
        activate:
          on-profile: test
    ---
    server:
      port: 8083
    
    spring:
      config:
        activate:
          on-profile: pro
    ---
    #指定当前使用环境
    spring:
      profiles:
        active: dev
    
激活
  • 配置文件

    输入spring.profiles.active=xxx

  • 虚拟机参数

    idea-edit configurations-configuration-environment-VM options,输入-Dspring.profiles.active=xxx

  • 命令行参数

    idea-edit configurations-configuration-environment-program arguments,输入–spring.profiles.active=xxx

    没有IDE,在命令行运行:java -jar xxx.jar --spring.profiles.active=xxx

内部配置加载顺序

优先级由高到低,高优先级的会覆盖低优先级的

  1. 项目下config目录下
  2. 项目根目录
  3. classpath config目录下
  4. classpath 根目录
外部配置加载顺序

看官网https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config

三 整合其它框架

整合Junit
  1. pom.xml加入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
  2. src-test-java下创建测试类

  3. 添加@SpringBootTest(classes=启动类.class),测试类一般测试controller,service的方法,如果测试类与controller,service在同一包下可以不用指定启动类

  4. 编写测试方法

@SpringBootTest(classes=Springboot02Application.class)
class Springboot02ApplicationTests {

    @Test
    public void hello() {
        System.out.println("hello");
    }
}
整合Redis
  1. 加入依赖spring-boot-starter-data-redis
  2. 配置redis属性
  3. 注入RedisTemplate
整合Mybatis

参考https://gitee.com/SnailClimb/springboot-guide/blob/master/docs/basis/springboot-mybatis.md

四 自动配置

Condition

通过条件判断,选择性的创建Bean

自定义条件
  1. 定义条件类

    //自定义条件类实现Condition接口,重写matches方法
    public class ClassCondition implements Condition {
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            //获取注解属性值
            Map<String, Object> map = annotatedTypeMetadata.getAnnotationAttributes(ConditionOnClass.class.getName());
    
            System.out.println(map);
            String[] value = (String[]) map.get("value");
            boolean flag=true;
            try {
                for (String className: value) {
                    Class<?> aClass = Class.forName(className);
                }
            } catch (ClassNotFoundException e) {
                flag=false;
                e.printStackTrace();
            }
            return flag;
        }
    }
    
  2. 自定义注解

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    //指定条件类
    @Conditional(ClassCondition.class)
    public @interface ConditionOnClass {
        String[] value();
    }
    
  3. 初始化Bean时,用@ConditionOnClass指定条件判断的坐标

    @Configuration
    public class UserConfig {
        @Bean
        @ConditionOnClass(value = {"org.springframework.data.redis.core.RedisTemplate"})
        public User user() {
            return new User();
        }
    }
    
SpringBoot常用条件注解
  • @ConditionOnProperty:判断配置文件是否有对应属性和值
  • @ConditionOnClass:判断环境是否有对应字节码文件
  • @ConditionOnMissingBean:判断环境没有对应Bean
切换内置web服务器

四种服务器:Tomcat、Jetty、Undertow、Netty

举例:将Tomcat切换成Jetty

  1. 查看项目依赖关系图

    pom.xml-右键-diagrams-show dependencies

  2. 找到spring-boot-starter-tomcat,右键-exclude

  3. 添加spring-boot-starter-jetty依赖

@Enable*注解

用于动态启用某些功能,底层使用@Import注解导入配置类,实现Bean的动态加载

@Import注解

4种用法

  • 导入Bean

    @SpringBootApplication
    @Import(User.class)
    public class Springboot02Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args);
            Object user = run.getBean(User.class);
            System.out.println(user);
        }
    
    }
    
  • 导入配置类

    @Configuration
    public class UserConfig {
        @Bean
        public User user() {
            return new User();
        }
    }
    
    @SpringBootApplication
    @Import(UserConfig.class)
    public class Springboot02Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args);
            Object user = run.getBean(User.class);
            System.out.println(user);
        }
    
    }
    
  • 导入ImportSelector实现类

    public class MyImportSelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            return new String[]{"com.example.springboot02.domain.User"};
        }
    }
    
    @SpringBootApplication
    @Import(MyImportSelector.class)
    public class Springboot02Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args);
            Object user = run.getBean(User.class);
            System.out.println(user);
        }
    
    }
    
  • 导入ImportBeanDefinitionRegistrar实现类

    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
            registry.registerBeanDefinition("user",beanDefinition);
    
        }
    }
    
    @SpringBootApplication
    @Import(MyImportBeanDefinitionRegistrar.class)
    public class Springboot02Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(Springboot02Application.class, args);
            Object user = run.getBean(User.class);
            System.out.println(user);
        }
    
    }
    
@EnableAutoConfiguration注解

内部使用@Import({AutoConfigurationImportSelector.class})加载配置类

配置文件位置:META-INF/spring.factories,配置文件定义了大量配置类,应用启动时会自动加载配置类,初始化Bean

五 监听机制

实现以下监听器接口,重写相应方法进行监听ApplicationContextInitializer、SpringApplicationRunListener、CommandLineRunner、ApplicationRunner

六 启动流程

参考https://blog.youkuaiyun.com/mnicsm/article/details/93893669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162973060916780262569310%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162973060916780262569310&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-6-93893669.pc_search_similar&utm_term=springboot%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B&spm=1018.2226.3001.4187

七 监控

Actuator

实现对程序内部运行情况监控

  1. 添加依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  2. 配置文件加入

    #开启健康检查的完整信息
    management.endpoint.health.show-details=always
    
    #将所有监控暴露出来
    management.endpoints.web.exposure.include=*
    
  3. 访问http://localhost:8080/actuator查看所有监控

    http://localhost:8080/actuator/health查看健康情况,“status”:"UP"代表正常

    http://localhost:8080/actuator/info查看配置文件info前缀的信息

Spring Boot Admin

图形化界面进行监控

服务端模块

  1. 加入依赖spring-boot-admin-starter-server
  2. 启动类加上@EnableAdminServer

客户端模块

  1. 加入依赖spring-boot-admin-starter-client

  2. 配置文件

    spring.boot.admin.client.url=http://localhost:8080
    management.endpoint.health.show-details=always
    management.endpoints.web.exposure.include=*
    
  3. 先启动server,再启动client

  4. 访问http://localhost:8080

IDEA在endpoints也可以查看部分监控

八 部署

jar

看https://blog.youkuaiyun.com/weixin_46818541/article/details/119459444

war
  1. 启动类继承SpringBootServletInitializer,重写configure方法
  2. pom.xml修改打包方式为war
  3. 打包,启动外部tomcat,访问时注意加上项目名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值