1.SpringBoot使用注意事项

1.1关于Build标签说明

        如果没有build标签则项目打包之后不能正常运行,报错

springboot 配置自定义标签库tld springboot常用标签_加载

 1.2关于主启动类说明

        1.2.1 关于元注解的说明

        @Target(ElementType.TYPE) 该注解对类有效

        @Retention(RetentionPolicy.RUNTIME) 该注解在运行期有效

        @Document 生成源码时 是否动态生成注释文档

        @Inherited 标识注解是否可以被继承

        1.2.2@ComponentScan说明

        说明:当springBoot启动时,会实例化很多的对象,但是需要排除特定的类型

        原因:SpringBoot内部兼容了很多的第三方框架,但是其中个别加入之后会影响整个代码流程

                所以通过这样的方式将个别的类排除在外 

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

         1.2.3 @SpringBootConfiguration注解说明

        关键词:配置文件/配置类   作用:整合第三方框架(配置)

        @Configuration:该注解一般标识类文件,告知springBoot程序  这个类用来整合第三方框架/配置的

        @SpringBootConfiguration修饰主启动类,说明主启动类也是一个配置类

        SpringBoot主启动类会扫描用户自己的配置类,并且实例化对象

springboot 配置自定义标签库tld springboot常用标签_赋值_02

         1.2.4 @EnableAutoConfiguration注解说明

        说明:自动化的配置如图所示:

   springboot 配置自定义标签库tld springboot常用标签_赋值_03

         @AutoConfigurationPackage说明:

        该注解表示自动配置的包扫描的路径

        工作原理:该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制

        知识点:以后写代码都应该在主启动类的同包及子包中

        

        @Import(AutoConfigurationImportSelector.class)

        SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置)

        思考:dependencies代表程序的依赖项,(将其它的包加载到自己的项目中),只是加载不负责执行

        流程说明(重点!!!)

        当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class)

        该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行

        当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容)

        如果匹配不到,则继续向下执行,最终SpringBoot程序加载成功

        1.2.5 主启动类注解结构图

springboot 配置自定义标签库tld springboot常用标签_其他_04

        1.2.6 关于依赖考题

        问题:用户暂时不需要数据库的配置,问:能否先行添加数据源的启动项?(不添加任何注解!!)

        答案:不可以,因为启动项执行需要完整配置,数据源信息并未添加,导致报错

        总结:SpringBoot项目中的依赖包尤其启动项,添加时慎重,如果需要添加启动器,则必须保证配置完整.否则程序启动必然失败

 springboot 配置自定义标签库tld springboot常用标签_spring_05

 2.SpringBoot高级用法

2.1属性赋值

        2.1.1 @Value为属性赋值

        YML配置信息

# SpringBoot启动时 默认加载yml文件
msg:
  hello: "今天下雨,记得带伞~~"

        动态赋值:

springboot 配置自定义标签库tld springboot常用标签_其他_06

2.2properties文件为属性赋值

        2.2.1 业务说明

        业务有时会需要动态赋值,如果将大量的业务数据写到yml文件中  导致代码混乱.最好的方式应该指定properties文件为业务赋值

        2.2.2 编辑properties文件

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

         2.2.3 动态为属性赋值

        

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 则可以省略不写
@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;
    }
}

2.2 环境切换

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

语法:

        1.使用--实现YML配置文件的分割

        2.定义环境名称

        3.定义默认环境名称

#指定默认的环境
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: "我喜欢测试"

2.3热部署

        2.3.1添加依赖

<!--支持热部署 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
</dependency>

        2.3.2配置IDEA环境

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

springboot 配置自定义标签库tld springboot常用标签_加载_07

 springboot 配置自定义标签库tld springboot常用标签_spring_08

 2.4 Lombok插件安装

        2.4.1插件安装

springboot 配置自定义标签库tld springboot常用标签_其他_09

         2.4.2 添加jar包

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

        2.4.3 lombok作用

        

//标准写法
//知识点: 为什么需要添加无参构造???
//       利用反射机制实例化对象时,默认调用无参构造
@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;
    }*/
}

        2.4.4 lombok知识点

        问题:lombok使用需要提前安装lombok插件!!如果项目发布在Linux系统中.问:系统是否需要提前安装插件?

        答案:不要  因为lombok插件在编译器有效

2.5 SpringBoot测试类用法

        2.5.1  业务说明

        说明:有时由于业务需要,需要进行单元测试,单元测试中的对象可能会依赖Spring容器

        需求:需要Spring容器管理一个User对象.  id=101  name="好好学习"

        分析:难点:定制化属性内容!!! 具体业务功能.利用配置类实现

        2.5.2  编辑配置类

//作用: 将自己需要的对象交给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,"好好学习");
    }
}

        2.5.3 Spring对象注入原理

        根据对象类型进行注入

springboot 配置自定义标签库tld springboot常用标签_其他_10

        2.5.4  编辑测试类

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. 根据类型注入 (默认规则)
     *      2. 根据名称注入   @Autowired
     *                      @Qualifier("user")
     */
    @Autowired
    //@Qualifier(value="user")
    private User user;

    @Test
    public void testUser(){
        System.out.println(user.toString());
    }
}