springboot的高级用法与主启动类说明

springboot的高级用法与主启动类说明


@Value注解(属性赋值)

  • 需求说明:有需要动态的获取数据,不能直接写死在代码中

  • 使用场景:如果代码中需要给成员变量赋值时,一般采用动态赋值的方式

  • 案例:

    • 在yml中配置信息

      • # SpringBoot启动时 默认加载yml文件
        msg:
          hello: "今天下雨,记得带伞~~"
        
      • img
    • 在properties文件中为属性赋值

      • 业务说明:业务有时需要动态赋值,如果大量的业务数据写到yml文件中,数据太过混乱,最好的方式应该指定properties文案金为业务复制

      • 编辑properties文件

        • #语法:
          #数据结构:   key=value
          #注意事项:   不要添加""号 本身就是字符串.
          #字符集编码:  写法采用utf-8,程序读取时采用ISO-8859-1
          pro.msg=配置信息
          
      • 控制层代码

        • package com.jt.controller;
          
          import org.springframework.beans.factory.annotation.Value;
          import org.springframework.context.annotation.PropertySource;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;
          
          @RestController  //将该类交给Spring管理
          //spring负责加载指定的配置文件
          //如果注解中只有一个属性名称为value 则可以省略不写,将程序读取时的编码格式设置为utf8,防止中文乱码
          @PropertySource(value="classpath:/msg.properties",encoding = "utf-8")
          public class HelloController {
          
              /**
               * 规则:
               *    1. 当Spring容器启动时,会加载YML配置文件.
               *       会将内部的key-value结构 加载到spring维护的内存空间中
               *    2. @Value功能,从spring容器中根据key 动态赋值
               *    3. springel表达式 简称:spel
               *
               * 使用场景:
               *      如果代码中需要给成员变量赋值时,一般采用动态赋值的方式.
               */
              @Value("${msg.hello}")
              private String msg;
              @Value("${pro.msg}")
              private String proMsg;
          
          
              @RequestMapping("/hello")
              public String hello(){
          
                  return msg+"||"+proMsg;
              }
          }
          

环境切换

  • 在开发的时候可能分为几个环境:开发环境、测试环境、生产环境等

  • 要求:不管是几个环境,要求配置下你给都必须相同,值可以不同

  • 语法:

    • 使用-实现yml配置文件的分割
    • 定义环境的名称
    • 定义默认的环境名称
  • 案例:yml文件:

    • #指定默认的环境
      spring:
        profiles:
          active: test
      ---
      
      #关于YML配置文件说明
      # 1.数据结构    key=value
      # 2.数据类型    默认都是字符串 如果需要类型转化,则框架已经在内部完成
      # 3.yml写法:   1.key: (空格)value  2.有层级结构 编辑时注意
      # 4.字符集编码: 默认程序加载时都是UTF-8
      #定义环境名称
      spring:
        config:
          activate:
            on-profile: dev
      
      server:
        port: 8080
        #项目发布的路径
        servlet:
          #  /缺省值  localhost:8080/jt/xxxx请求路径
          context-path: /
      
      #2.为属性赋值  hello代表前缀    key=hello.msg
      hello:
          msg: "我喜欢开发"
      
      #环境分割线
      ---
      spring:
        config:
          activate:
            on-profile: test
      
      server:
        port: 8090
        #项目发布的路径
        servlet:
          #  /缺省值  localhost:8080/jt/xxxx请求路径
          context-path: /
      
      #2.为属性赋值  hello代表前缀    key=hello.msg
      hello:
        msg: "我喜欢测试"
      

lombok插件的使用

  • 添加jar包

    • 		<!--引入插件lombok 自动的set/get/构造方法插件  -->
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
              </dependency>
      
  • 常用注解

    • //标准写法
      //知识点: 为什么需要添加无参构造???
      //       利用反射机制实例化对象时,默认调用无参构造
      @Data //get/set/toString/equals/hashcode
      @NoArgsConstructor //无参构造
      @AllArgsConstructor//全参构造
      @Accessors(chain = true)//开启链式编程
      public class User implements Serializable {
          private Integer id;
          private String name;
      
          //链式加载的底层原理 返回User对象
         /* public User setId(Integer id){
              this.id = id;
              return this;    //代表当前对象!!!!!
          }
      
          public User setName(String name){
              this.name = name;
              return this;
          }*/
      }
      

热部署

  • 添加依赖:

    • <!--支持热部署 -->
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-devtools</artifactId>
      </dependency>
      
  • 配置idea环境

    • 快捷键:ctrl+shift+alt+/ 或者 ctrl + shift + a

      • img

      • 勾选属性即可实现热部署

        • img

springboot测试类用法

  • 业务说明:

    • 说明:有时由于业务需要,需要进行单元测试, 单元测试中的对象可能会依赖Spring容器.
      需求: 需要Spring容器管理一个User对象. id=101 name=“好好学习”
      分析: 难点: 定制化属性内容!!! 具体业务功能. 利用配置类实现!!!
  • 编辑配置类

    • //作用: 将自己需要的对象交给Spring容器管理
      @Configuration  //标识这是一个配置类
      public class UserConfig {
      
          /**
           * 知识点:1.Spring内部维护一个Map集合
           *       2. Map集合 key/value 分别是谁???
           *       3.IOC管理的对象的方式   1.@Controller等注解 2.@bean
           *  
           * 1.注解组合:  @Configuration +  @Bean
           * 2.什么是bean: 被spring管理的对象就是bean
           * 3.@Bean注解的作用
           *      将方法的返回值对象交给Spring管理
           * 4.Spring如何管理对象?
           *   数据结构: Map集合   Map<K,V>
           *   key:   对象的ID
           *   value: 实例化之后的对象
           * demo1: Spring如何管理对象
           *      key: 方法的名称
           *      value: 方法的返回值   Map<user,new User()>
           *
           * demo2:
           *      @Controller
           *      HelloController{}
           *      key: helloController   首字母小写
           *      value: spring通过反射创建的HelloController对象
           * return
           */
          @Bean
          public User user(){
      
              return new User(101,"好好学习");
          }
      }
      
  • 编辑测试类

    • package com.jt.test;
      
      import com.jt.pojo.User;
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Qualifier;
      import org.springframework.boot.test.context.SpringBootTest;
      
      /**
       * 原理说明:
       *  1.当测试类执行时,会根据SpringBoot的配置,动态启动Spring容器.
       *  2.当spring容器启动时,会加载所有的注解和配置类,最终将所有的对象
       *  交给Spring容器管理  Map集合
       *  3.@SpringBootTest 通过这个注解,可以动态的从spring容器中
       *  获取对象
       *
       */
      @SpringBootTest
      public class TestSpring {
      
          /**
           * 注入方式:
           *      1. 根据类型注入 (默认规则)@Autowired
           *      2. 根据名称注入     @Qualifier("user")
           */
          @Autowired
          //@Qualifier(value="user")
          private User user;
      
          @Test
          public void testUser(){
              System.out.println(user.toString());
          }
      }
      
  • spring对象注入原理(依赖注入):

    • img

sprinigboot的主启动类说明

  • 主启动类注解结构图

    • img
  • 关于元注解的说明:

    • @Target(ElementType.TYPE) 该注解对类有效
      @Retention(RetentionPolicy.RUNTIME) 该注解在运行期有效
      @Documented 生成源码时 是否动态生成注释文档
      @Inherited 标识注解是否可以被继承
  • @ComponentScan说明

    • @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
      
    • 说明:当springboot启动时,会扫描用户自己的配置类,并且实例化对象,但是会排除特定的类型,避免影响整个代码的流程

  • @SpringBootConfiguration注解说明

    • img
    • img
    • @Configuration:该注解一般标识类文件,告知springboot程序,这个类是一个用来整合第三方框架/配置的
    • 从上图可以看出主启动类也是一个配置类
  • @EnableAutoConfiguration注解说明

    • img

    • @AutoConfigurationPackage说明

      该注解表示自动配置的包扫描的路径.
      工作原理: 该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制.
      知识点: 以后写代码都应该在主启动类的同包及子包中.

    • @Import(AutoConfigurationImportSelector.class)
      知识回顾: SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置).
      思考: dependencies代表程序的依赖项,(将其他的包加载到自己的项目中), 只是加载不负责执行.

    • 流程说明(重点!!!)
      当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class),
      该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行.
      当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容).
      如果匹配不到,则继续向下执行.最终SpringBoot程序加载成功.

    • img
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值