springboot官网文档:https://docs.spring.io/spring-boot/docs/current/reference/html/

尚硅谷springboot2文档:https://www.yuque.com/atguigu/springboot/

1、入门创建项目

1.1 pom.xml

<!-- 引入springboot父工程,定义了各种starter 启动器 -->
   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>


    <dependencies>
       <!-- 引入web 开发依赖,包含springmvc、 tomcat等 -->
       <!-- springboot 依赖名都是各种starter -->
       <!-- springboot 自带的starter 命名方式:spring-boot-starter-**模块名** -->
       <!-- 自带模块 在引入时可以不写version版本号,因为在 springboot 中定义了默认的版本号,并且是兼容的 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
           <!-- <version> 版本号  </version> -->
        </dependency>

        <!--第三方starter,命名方式:xxxx-spring-boot-starter-->
        <!-- 第三方starter,需要定义版本 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

    </dependencies>


 <build>
        <plugins>
           <!--maven打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

关于starter 详情: https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

1.2 主程序类:

在项目根目录下创建主程序

/**
 * 主程序类
 * @SpringBootApplication:这是一个SpringBoot应用
@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
 */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

1.3 默认的包结构:

主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
无需以前的包扫描配置
想要改变扫描路径,@SpringBootApplication(scanBasePackages="com.atguigu")
或者@ComponentScan 指定扫描路径

2 配置

2.1 自动配置

  • springboot 启动器 starter 中有 包含了 XxxAutoConfiguration 配置类。
  • 在这配置类中对 该组件所需要的配置都给出了默认值。
  • springboot自带的启动器,所有的自动配置功能都在 spring-boot-autoconfigure 包里面。第三方的starter 配置类在其自己包里。
  • 默认配置最终都是映射到 xxxxProperties 属性类上,如:MultipartProperties,配置文件的值最终会绑定每个类上,这个类会在容器中创建对象。
  • 按需加载所有自动配置项,引入了哪些组件,这写组件的自动配置才会开启(通过注解 @ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty等,条件加载相关组件配置类)
  • 通过 @Bean ,@Import 等 将组件注入spring 容器

@Import(AutoConfigurationImportSelector.class) // 默认扫描系统里面所有META-INF/spring.factories位置的文件。spring.factories 文件里面写死了spring-boot一启动就要给容器中加载的所有配置类

2.2 自定义配置类

1)@Configuration + @Bean 向容器注入自定义组件

@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件。
//@ConditionalOnBean(name = "tom")
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {


    /**
     * Full模式(proxyBeanMethods = true,默认 ):外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * lite模式 ( proxyBeanMethods = false ):每次都是新组件
     * @return
     */

    @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }

    @Bean("tom22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

2)@Component + @ConfigurationProperties 从配置文件中读取 字段的值。配置项前缀自定义

/**
 * 只有在容器中的组件,才能生效
 */
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {

    private String brand;
    private Integer price;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。需要@EnableConfigurationProperties注解,使用 @ConfigurationProperties 生效

@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}

2.3 配置文件

配置文件默认位于 根目录(resources)下,默认文件名为 application.properties,也支持 application.yaml/application.yml。
若这两种文件都存在 那 application.properties文件配置会覆盖 yaml 文件中相同的项。

1)配置提示:引入后,在配置文件中给自定义对象属性初始化值的时候会有属性名的提示
配置对应的pom文件,且打包时排除

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>


 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

2)Profile功能
为了方便多环境适配,springboot简化了profile功能

  • 默认配置文件 application.yaml;任何时候都会加载
  • 指定环境配置文件 application-{env}.yaml
  • 激活指定环境:
    a) 配置文件激活:在默认配置文件中添加 spring.profiles.active=production ,激活 application-production .yaml 配置
    b)命令行激活:java -jar xxx.jar --spring.profiles.active=prod --person.name=haha 修改配置文件的任意值,命令行优先
  • 默认配置与环境配置同时生效
    同名配置项,profile配置优先

profile分组

spring.profiles.group.production[0]=proddb  # application-proddb.yaml
spring.profiles.group.production[1]=prodmq  # application-prodmq.yaml

spring.profiles.active=production  #激活

@Profile条件装配功能

@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {

    // ...

}

配置加载

1、外部配置源
常用:Java属性文件、YAML文件、环境变量、命令行参数;

2、配置文件查找位置
(1) classpath 根路径
(2) classpath 根路径下config目录
(3) jar包当前目录
(4) jar包当前目录的config目录
(5) /config子目录的直接子目录
3、配置文件加载顺序:
 当前jar包内部的application.properties和application.yml
 当前jar包内部的application-{profile}.properties 和 application-{profile}.yml
 引用的外部jar包的application.properties和application.yml
 引用的外部jar包的application-{profile}.properties 和 application-{profile}.yml
4、指定环境优先,外部优先,后面的可以覆盖前面的同名配置项

3web开发

3.1、请求参数

注解:
@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody

@RestController
public class ParameterTestController {

    // 如果参数未加注解默认等同 @RequestParam 处理前端传 application/x-www-form-urlcoded 类型值
    //  car/2/owner/zhangsan?age=xxx&inters=mmm&inters=mm
    @GetMapping("/car/{id}/owner/{username}")
    public Map<String,Object> getCar(@PathVariable("id") Integer id,
                                     @PathVariable("username") String name,
                                     @PathVariable Map<String,String> pv,  // 将路径参数转为map
                                     @RequestHeader("User-Agent") String userAgent,
                                     @RequestHeader Map<String,String> header,  // 将请求头转为map
                                     @RequestParam("age") Integer age,
                                     @RequestParam("inters") List<String> inters,
                                     @RequestParam Map<String,String> params,  // 将请求参数转为map
                                     @CookieValue("_ga") String _ga,
                                     @CookieValue("_ga") Cookie cookie){


        Map<String,Object> map = new HashMap<>();

//        map.put("id",id);
//        map.put("name",name);
//        map.put("pv",pv);
//        map.put("userAgent",userAgent);
//        map.put("headers",header);
        map.put("age",age);
        map.put("inters",inters);
        map.put("params",params);
        map.put("_ga",_ga);
        System.out.println(cookie.getName()+"===>"+cookie.getValue());
        return map;
    }

    // @RequestBody 处理application/json类型的前端提交参数
    @PostMapping("/save")
    public Map postMethod(@RequestBody String content, @RequestBody User user){
        Map<String,Object> map = new HashMap<>();
        map.put("content",content);
        return map;
    }


    //1、语法: 请求路径:/cars/sell;low=34;brand=byd,audi,yd
    //2、SpringBoot默认是禁用了矩阵变量的功能
    //      手动开启:原理。对于路径的处理。UrlPathHelper进行解析。
    //              removeSemicolonContent(移除分号内容)支持矩阵变量的
    //3、矩阵变量必须有url路径变量才能被解析
    @GetMapping("/cars/{path}")
    public Map carsSell(@MatrixVariable("low") Integer low,
                        @MatrixVariable("brand") List<String> brand,
                        @PathVariable("path") String path){
        Map<String,Object> map = new HashMap<>();

        map.put("low",low);
        map.put("brand",brand);
        map.put("path",path);
        return map;
    }

    // /boss/1;age=20/2;age=10

    @GetMapping("/boss/{bossId}/{empId}")
    public Map boss(@MatrixVariable(value = "age",pathVar = "bossId") Integer bossAge,
                    @MatrixVariable(value = "age",pathVar = "empId") Integer empAge){
        Map<String,Object> map = new HashMap<>();

        map.put("bossAge",bossAge);
        map.put("empAge",empAge);
        return map;

    }

}

3.2 响应

响应JSON:jackson.jar+@ResponseBody

web场景自动引入了json场景,@RestController = @Controller + @ResponseBody 。自动返回json