欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot 学习笔记

程序员文章站 2022-07-10 18:13:23
...

 

 

 

 

 

 

 

  1. 优点
    1. 使用嵌入式的servlet容器,应用无需打成war包
    2. starts自动依赖与版本控制
    3. 大量的自动配置,简化开发,也可以修改默认值
    4. 无需配置xml,无代码生成
    5. 准生产环境运行时应用监控
    6. 与云计算天然集成
  2. maven设置
    ​
    <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>            
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>
    
    ​

     

  3. 第一个springboot工程
    1. 创建一个maven工程
    2. 导入springboot依赖
      <dependencies> 
          <dependency> 
              <groupId>org.springframework.boot</groupId> 
              <artifactId>spring-boot-starter-web</artifactId> 
              <version>2.1.5.RELEASE</version> 
              <type>pom</type> 
          </dependency>
      </dependencies>
    3. 编写一个主程序,此程序用于启动springboot
      @SpringBootApplication//标注一个主程序类说明这是一个springboot应用
      public class HelloWorldMainApplication { 
          public static void main(String[] args) {         
               SpringApplication.run(HelloWorldMainApplication.class,args);
       }
      }
    4. 编写相关的Controller ,service
    5. 测试
  4. 使用spring initializer 快速创建springboot项目
    1. ide都支持spring的项目创建向导快速创建一个springboot项目,选择我们需要的模块向导会联网创建springboot项目
    2. resource文件夹中的目录结构
      1. static保存所有的静态资源js,css,图片
      2. templates保存所有的模板页面(springboot默认jar包使用嵌入式的tomcat ,默认不支持jsp页面)可以使用模板引擎(freemark,thymeleaf)
      3. application.properties:是springboot默认配置文件,可以修改一些默认配置
  5. 部署与配置
    • 导入插件
      <dependency> 
          <groupId>org.springframework.boot</groupId> 
          <artifactId>spring-boot-maven-plugin</artifactId> 
          <version>2.2.2.RELEASE</version> 
          <type>maven-plugin</type>
      </dependency>
    • 调出菜单栏打包spring boot 学习笔记使用java -jar命令运行
    • spring-boot-starter 是场景启动器,springboot将所有功能场景抽离做成starter,只要引入这些starter、相关场景的依赖都会导入
  6. 主程序类,主入口类
    • @springbootapplication标注的类为springboot的主配置类springboot会运行这个main方法来启动,这个注解是一个组合注解
      @Target({java.lang.annotation.ElementType.TYPE})
      @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      @SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan(excludeFilters = {@Filter(type = CUSTOM, classes = {TypeExcludeFilter.class}), 
      @Filter(type =CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})
      public @interface SpringBootApplication { 
      @AliasFor(annotation = EnableAutoConfiguration.class)
      Class<?>[] exclude() default {}; 
      @AliasFor(annotation = EnableAutoConfiguration.class) String[] excludeName() default {}; 
      @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {};
       @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {};
      }
    • @springBootConfiguration:springboot主配置类
      • @Configuration:配置类也是容器中的一个组件
    • @EnableAutoConfiguration:开启自动配置功能
      • @AutoConfigurationPackage:自动配置包
        • @import(AutoConfigurationPackages.Registrar.class):spring的底层注解,给容器中导入组件,AutoConfigurationPackages.Registrar将朱配置类所在包以及下面所有组件扫描到spring容器中
      • @Import(EnableAutoConfigurationImportSelector.class):EnableAutoConfigurationImportSelector选择器,将所有需要导入的组件以全类名的方式返回这些组件会被添加到容器中,会给容器中导入很多自动配置类(xxAutoConfiguration)就是给容器导入这个场景需要的所有组件并配置好这些组件,springboot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定值,将这些值作为自动配置类导入到容器中自动配置类生效,帮我们进行自动配置工作
  7. 配置文件
    springboot使用一个全局的配置文件,配置文件名是固定的
    • application.properties
    • application.yml
    • 配置文件的作用
      修改springboot自动配置的默认值springboot在底层都已经做了默认配置
    • yaml是一种伪标记语言
      语法:
      server:
          port: 8080  
          path: /hello
      标记语言
      以前的配置文件大多数使用的是xml文件yaml以数据为中心比json,xml更适合做配置文件​
      k:空格v:表示一对键值对  空格  必须有
       以空格的缩进来控制层级关系,只要是左对齐的一列数据都是同一层级的
      
      值的写法
      字面量:普通的值(数字,字符串,布尔)
      k: v字面量直接写,字符串默认不加上单引号或者双引号双引号不会转义字符串里面的特殊字符,特殊字符会作为本身所表示的意思name: "zhangsan \n lisi"输出:zhangsan换行 lisi单引号​​会转义特殊字符,特殊字符会作为一个普通的字符串数据name: "zhangsan \n lisi"输出: zhangsan \n lisi
      对象,map:(属性和值)(键值对)
      k: v:在下一行来写属性和值之间的关系注意缩进
      对象还是k: v的方式
      写法一
      friends:
          lastname: zhangsan
          age: 20
      写法二,行内写法
      friends:{lastname: zhangsan,age:18}
      数组(list,set)
      用-值表示数组中的一个元素
      pets:
          - cat
          - dog
      行内写法
      pets:[cat,dog]
      server:
          port: 8080  
          path: /hello
       
  8. 配置文件值注入
    • 配置文件
      persion: 
          name: yangdong 
          age: 30 
          boss: false 
          kv: 
              name: lili 
              age: 12 
          list: 
              - lili 
              - lucy 
          pet: 
              name: benben 
              age: 3
    • javaBean
      @Component
      @ConfigurationProperties(prefix = "persion")
      public class persion { 
      private String name; 
      private String age; 
      private Boolean boss; 
      private Map<Object,Object> kv; 
      private List<Object> list; 
      private pet pet; 
      public String getName() { return name; } 
      public String getAge() { return age; } 
      public Boolean getBoss() { return boss; } 
      public Map<Object, Object> getKv() { return kv; } 
      public List<Object> getList() { return list; }
      public com.yang.springboothelloworldquicly.bean.pet getPet() { return pet; } 
      public void setName(String name) { this.name = name; } 
      public void setAge(String age) { this.age = age; } 
      public void setBoss(Boolean boss) { this.boss = boss; } 
      public void setKv(Map<Object, Object> kv) { this.kv = kv; } 
      public void setList(List<Object> list) { this.list = list; } 
      public void setPet(com.yang.springboothelloworldquicly.bean.pet pet) { this.pet = pet; } 
      @Override public String toString() { return "persion{" + "name='" + name + '\'' + ", age='" + age + '\'' + ", boss=" + boss + ", kv=" + kv + ", list=" + list + ", pet=" + pet + '}'; }}
       
      • @ConfigurationProperties:告诉springboot将本类中所有属性和配置文件中相关配置进行绑定,默认从全局配置文件中获取值,前提是这个组件纳入容器管理,支持数据校验@Validated
      • @PropertySource(value={“classpath:XX.properties”。。。。})可以读取多个properties,只能读取properties
      • @importResource(locations={“classpath:beans.xml”}):导入spring配置文件,让配置文件里面的内容生效。我们自己编写的配置文件springboot不能识别,把这个标签标注在主配置类上,springboot便可以识别,springboot不推荐这种方法
      • springboot推荐给容器中添加组件的方式
        • 配置类全注解方式,类似于spring配置文件,
          • 配置类注解@Configuration指明当前类是一个配置类就是来替代之前的spring配置文件,之前在配置文件中用<bena>来添加组件在配置类里面有@Bean注解
          • @Bean:将方法的返回值添加到容器中,容器中这个组件的默认id就是方法名
      • @Value:用处和@configurationProperties相似,这个注解标注在属性上可以给单个属性赋值@Value(字面量,${属性名.属性值}从配置文件中获取值,#{spring表达式})不支持复杂类型封装
      • 配置文件yml和properties都能取到值,如果某个业务逻辑需要获取配置文件中的某个值则用@Value,如果我们专门编写了一个javaBean来和配置文件进行映射,我们直接用@ConfigurationPropertiesspring boot 学习笔记
      •     数据校验@Validated
        • spring boot 学习笔记                   
      • 配置文件占位符
        • spring boot 学习笔记
      1.  随机数 
        占位符获取之前配置的值,如果没有可以用“:”指定默认值
        ${persion.hello:hello},
        random.value,
        {random.int},
        ${random.lang},
        random.int(10),
        {random.int[1024,65536 ]}
        

         

  9. profile
    • profile是springboot对不同环境提供不同配置功能的支持,可以通过**,指定参数等方式快速切换环境
    • 多profile文件
      • 我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml,默认使用application.properties
    • yml支持多问挡块方式
      • spring boot 学习笔记
      • **指定profile
        • 用命令行**spring boot 学习笔记
          • 在program argument里面输入--spring.profiles.active=dev
            • 命令行**的优先级高于在配置文件中指定
            • 也可以在打包后使用java命令切换环境
              • java -jar 项目名 --spring.profiles.active=dev
            • 虚拟机参数
              • 在vm options参数里面写-Dspring.profiles.active=dev
        • 在配置文件中指定spring.profiles.active=dev
  10.  配置文件加载位置spring boot 学习笔记
    • file是指项目目录,classpath是指类目录
      • 优先级由高到低高优先级配置文件会覆盖低优先级配置springboot会从这4个位置全部加载主配置文件,互补配置
      • 通过--spring.config.location=l路径 指定默认配置文件是在项目打包后使用命令行参数的形式来指定配置文件的新位置,指定配置文件和默认加载的配置文件会共同起作用
  11. 自动配置原理
    • springboot启动后加载主配置类,开启了自动配置功能@EnableAutoConfiguration
    • @EnableAutoConfiguration作用
      利用EnableAutoConfigurationimportSelector给容器中导入一些组件
      selectimports(){
          List<String> configurations=getCandidateConfigurations(annotationMetadata,attrbutes)
      }获取候选配置
      springFactories.loadFactoryNames()扫描所有jar包类路径下 META/spring.factories
      把扫描到的文件内容包装成properties对象,
      从properties中获取到EnableAutoConfiguration.class类(类名)对应的值然后把它们添加入容器中
      
      将类路径下 META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中每一个这样的XXAutoConfiguration类都是容器中的一个组件,它们的作用就是做自动配置
       spring boot 学习笔记
  12. 每一个自动配置类进行自动配置功能
    • 以HttpEncodingAutoConfiguration为例解释自动配置原理,首先根据不同条件判断决定这个配置类是否会生效
    • spring boot 学习笔记
    •  HttpEncodingAutoConfiguration类主要方法及属性,一旦这个配置类生效则会给容器添加fiter组件,组件的属性从properties类中获取,properties类中的属性和配置文件绑定spring boot 学习笔记
    • HttpEncodingProperties类,封装了配置文件可以配置的属性,配置文件可以配置什么就可以参照某个功能对应的这个属性类spring boot 学习笔记
    •  精髓
      • XXXXProperties封装配置文件中的相关属性
      • XXAutoConfiguration自动配置类给容器中添加组件
      • 给容器中自动配置类添加组件的时候会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的值
      • 我们再来看这个配置类中到底配置了哪些组件,如果有我们用的组件我们就不用配置了
      • 我们看我们需要的功能有没有springboot默认写好的自动配置类
      • springboot启动会加载大量的配置类
  13.  Conditional派生注解及其作用
    • 作用:必须是@Conditional指定的条件成立才给容器添加组件配置里面的所有内容才会生效spring boot 学习笔记
    • 自动配置类在一定条件下才能生效在配置文件中设置debug=true则可以在配置文件中看到那些配置类生效
  14. 日志
    • 日志框架
      • 统一的接口层 slf4j
      • 具体的实现logback
    • slf4j的使用
      • 开发过程中应该调用日志抽象层里面的方法,不应该直接调用日志的实现类系统中应该存在slf4j和logback的jar包
      • spring boot 学习笔记
      • 每一个日志的实现框架都有自己的配置文件,使用slf4j以后配置文件还是日志实现框架自己的配置文件
      • 统一日志记录
        • 将系统中其他日志框架先排除出去
        • 用中间包替换原来的日志框架
        • 导入slf4j其他的实现
      • springboot日志关系
        • spring boot 学习笔记
        • springboot使用这个依赖来做日志功能spring boot 学习笔记
        • 底层依赖关系spring boot 学习笔记
        • springboot是使用slf4j+logback的方式进行日志记录,也把其他的日志都替换成了slf4j
        • 中间替换包spring boot 学习笔记spring boot 学习笔记
        • 如果要引入其他框架则一定要把其他框架的默认日志依赖移除掉
          • spring框架用的是commons-logging,springboot就会排除commons-logging的依赖spring boot 学习笔记
          • springboot能自动适配所有的日志,而且使用slf4j+logback的方式记录日志,引入其他框架的时候要把这个框架的日志依赖排除掉
      • 日志使用
        • spring boot 学习笔记
        • springboot修改日志的默认配置spring boot 学习笔记
        • 日志输出格式spring boot 学习笔记
        • 指定配置
          • 给类路径下放上每个日志框架自己的配置文件即可:springboot就不使用默认的了
          • spring boot 学习笔记
          • logback.xml:直接被日志框架识别
          • logback-spring.xml:日志框架不直接加载日志的配置项由springboot解析日志配置,可以使用springboot的高级profile功能
          • spring boot 学习笔记
        • 切换日志框架
          • 可以按照slf4j的日志适配图,进行相关的切换,要依赖log4j的适配器,排除掉logback和springboot适配的log4j
          • slf4j+log4j的方式spring boot 学习笔记
          • 切换为log4j2spring boot 学习笔记
  15. web开发
    • 创建springboot应用,选中我们需要的模块
    • springboot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置
    • 自己编写业务代码
  16. tips
    • 介绍一下@responseBody的用法,这个标签可以使服务器返回数据而不是跳转页面,是一种restapi的方式,这个标签如果加到类上则说明此类下面所有方法都会返回数据给浏览器,也可以转换对象为json
    • RestController则是ResponseBody与Controller的合体
    • ctrl+n可以进行全局搜索