SpringBoot(一)

快速入门

1.概念

SpringBoot 简单、快速地创建一个独立的、生产级别的 Spring 应用(说明SpringBoot底层是Spring)

大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术

特性:

  • 快速创建独立 Spring 应用
    • SSM:导包、写配置、启动运行
  • 直接嵌入Tomcat、Jetty or Undertow(无需部署 war 包)【Servlet容器】
    • linux java tomcat mysql: war 放到 tomcat 的 webapps下
    • jar: java环境; java -jar
  • 重点:提供可选的starter,简化应用整合
    • 场景启动器(starter):web、json、邮件、oss(对象存储)、异步、定时任务、缓存...
    • 导包一堆,控制好版本。
    • 为每一种场景准备了一个依赖; web-starter。mybatis-starter
  • 重点:按需自动配置 Spring 以及 第三方库
    • 如果这些场景使用(生效)。这个场景的所有配置都会自动配置好。
    • 约定大于配置:每个场景都有很多默认配置。
    • 自定义:配置文件中修改几项就可以
  • 提供生产级特性:如 监控指标、健康检查、外部化配置等
    • 监控指标、健康检查(k8s)、外部化配置
  • 无代码生成、无xml

总结:简化开发,简化配置,简化整合,简化部署,简化监控,简化运维

2.快速体验

场景:浏览器发送/hello请求,返回"Hello,Spring Boot 3!"

1.开发流程

1.创建项目

maven 项目

xml 复制代码
<!--    所有springboot项目都必须继承自 spring-boot-starter-parent -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
    </parent>

2.导入场景

场景启动器

xml 复制代码
    <dependencies>
<!--        web开发的场景启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

3.主程序

java 复制代码
@SpringBootApplication //这是一个SpringBoot应用
public class MainApplication {

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

4.业务

java 复制代码
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){

        return "Hello,Spring Boot 3!";
    }

}

5.测试

默认启动访问: localhost:8080
6.打包

xml 复制代码
<!--    SpringBoot应用打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

mvn clean package把项目打成可执行的jar包

java -jar demo.jar启动项目

2.特性小结

1.简化整合

导入相关的场景,拥有相关的功能。场景启动器

  • 官方提供的场景:命名为:spring-boot-starter-*
  • 第三方提供场景:命名为:*-spring-boot-starter
    场景一导入,万物皆就绪

2.简化开发

无需编写任何配置,直接开发业务
3.简化配置

application.properties:

  • 集中式管理配置。只需要修改这个文件就行 。
  • 配置基本都有默认值

4.简化部署

打包为可执行的jar包。
5.简化运维

修改配置(外部放一个application.properties文件)、监控、健康检查。

3.Spring Initializr 创建向导

3.应用分析

1.依赖管理机制

1、为什么导入starter-web所有相关依赖都导入进来?

  • 开发什么场景,导入什么场景启动器。
  • maven依赖传递原则。A-B-C: A就拥有B和C
  • 导入 场景启动器。 场景启动器 自动把这个场景的所有核心依赖全部导入进来

2、为什么版本号都不用写?

  • 每个boot项目都有一个父项目spring-boot-starter-parent
  • parent的父项目是spring-boot-dependencies
  • 父项目 版本仲裁中心,把所有常见的jar的依赖版本都声明好了。
  • 比如:mysql-connector-j

3、自定义版本号

  • 利用maven的就近原则
    • 直接在当前项目properties标签中声明父项目用的版本属性的key
    • 直接在导入依赖的时候声明版本
      4、第三方的jar包
  • boot父项目没有管理的需要自行声明好
xml 复制代码
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.16</version>
</dependency>

2.自动配置机制

  • 默认的包扫描规则
    • @SpringBootApplication 标注的类就是主程序类
    • SpringBoot只会扫描主程序所在的包及其下面的子包,自动的component-scan功能
    • 自定义扫描路径
      • @SpringBootApplication(scanBasePackages = "com.atguigu")
      • @ComponentScan("com.atguigu") 直接指定扫描的路径
  • 配置默认值
    • 配置文件的所有配置项是和某个类的对象值进行一一绑定的。
    • 绑定了配置文件中每一项值的类: 属性类。
    • 比如:
      • ServerProperties绑定了所有Tomcat服务器有关的配置
      • MultipartProperties绑定了所有文件上传相关的配置
  • 按需加载自动配置
    • 导入场景spring-boot-starter-web
    • 场景启动器除了会导入相关功能依赖,导入一个spring-boot-starter,是所有starter的starter,基础核心starter
    • spring-boot-starter导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类
    • 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。
      • 导入哪个场景就开启哪个自动配置

4.核心技能

1.常用注解

SpringBoot摒弃XML配置方式,改为全注解驱动
1.组件注册

@Configuration、@SpringBootConfiguration

@Bean、@Scope

@Controller、 @Service、@Repository、@Component

@Import

@ComponentScan

步骤:

1、@Configuration 编写一个配置类

2、在配置类中,自定义方法给容器中注册组件。配合@Bean

3、或使用@Import 导入第三方的组件

java 复制代码
//@SpringBootConfiguration
@Import(FastsqlException.class)//给容器中放指定类型的组件,组件的名字默认很全类名
@Configuration//这是一个配置类,替代以前的配置文件。配置类本身也是容器中的组件
public class AppConfig {
    //组件默认是单实例的
    @Bean("user2")//替代Bean标签。组件在容器中的名字默认是方法名。可以直接修改注解的值
    public User user() {
        var user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

2.条件注解

如果注解指定的条件成立,则触发指定行为

@ConditionalOnXxx

@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为

@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为

@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为

@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为

java 复制代码
@SpringBootConfiguration
public class AppConfig2 {
    @ConditionalOnClass(name="com.alibaba.druid.FastsqlException")
    @Bean
    public Cat cat01(){
        return new Cat();
    }
    @ConditionalOnMissingClass(value = "com.alibaba.druid.FastsqlException")
    @Bean
    public Dog dog01(){
        return new Dog();
    }
    @ConditionalOnBean(Dog.class)
    public User zhangsan(){
        return new User();
    }
    @ConditionalOnMissingBean(Dog.class)
    public User lisi(){
        return new User();
    }
}

3.属性绑定

@ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定

@EnableConfigurationProperties:快速注册注解:

  • 场景:SpringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了 @Component、@ConfigurationProperties 注解,也没用。因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器

将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

  • 1、给容器中注册组件(@Component、@Bean)
  • 2、使用@ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定
java 复制代码
@ConfigurationProperties(prefix = "pig")
@Component
public class Pig {
    ······
}
java 复制代码
@ConfigurationProperties(prefix = "sheep")
public class Sheep {
    ······
}
java 复制代码
//@SpringBootConfiguration
/*
1.开启Sheep组件的属性扫描
2.默认会把这个组件自己放到容器中
* */
@EnableConfigurationProperties(Sheep.class)//导入第三方写好的组件进行属性绑定
//SpringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了@Component、@ConfigurationProperties注解,也没用。因为组件都扫描不进来。
@Import(FastsqlException.class)//给容器中放指定类型的组件,组件的名字默认很全类名
@Configuration//这是一个配置类,替代以前的配置文件。配置类本身也是容器中的组件
public class AppConfig {
    //组件默认是单实例的
    @Bean("user2")//替代Bean标签。组件在容器中的名字默认是方法名。可以直接修改注解的值
    public User user() {
        var user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}
java 复制代码
@SpringBootApplication
public class Boot302DemoApplication {

    public static void main(String[] args) {
        var ioc=SpringApplication.run(Boot302DemoApplication.class, args);
        Pig pig = ioc.getBean(Pig.class);
        System.out.println("pig:"+pig);
        Sheep bean = ioc.getBean(Sheep.class);
        System.out.println(bean);
    }
}

2.YAML配置文件

1.基本语法

  • 大小写敏感
  • 使用缩进表示层级关系,k: v,使用空格分割k,v
  • 缩进时不允许使用Tab键,只允许使用空格。换行
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

表示注释,从这个字符一直到行尾,都会被解析器忽略。

支持的写法:

  • 对象:键值对的集合,如:映射(map)/ 哈希(hash) / 字典(dictionary)
  • 数组:一组按次序排列的值,如:序列(sequence) / 列表(list)
  • 纯量:单个的、不可再分的值,如:字符串、数字、bool、日期
java 复制代码
@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data //自动生成JavaBean属性的getter/setter
//@NoArgsConstructor //自动生成无参构造器
//@AllArgsConstructor //自动生成全参构造器
public class Person {
    private String name;
    private Integer age;
    private Date birthDay;
    private Boolean like;
    private Child child; //嵌套对象
    private List<Dog> dogs; //数组(里面是对象)
    private Map<String,Cat> cats; //表示Map
}

@Data
public class Dog {
    private String name;
    private Integer age;
}

@Data
public class Child {
    private String name;
    private Integer age;
    private Date birthDay;
    private List<String> text; //数组
}

@Data
public class Cat {
    private String name;
    private Integer age;
}

properties表示法

properties 复制代码
person.name=张三
person.age=18
person.birthDay=2010/10/12 12:12:12
person.like=true
person.child.name=李四
person.child.age=12
person.child.birthDay=2018/10/12
person.child.text[0]=abc
person.child.text[1]=def
person.dogs[0].name=小黑
person.dogs[0].age=3
person.dogs[1].name=小白
person.dogs[1].age=2
person.cats.c1.name=小蓝
person.cats.c1.age=3
person.cats.c2.name=小灰
person.cats.c2.age=2

yaml表示法

yaml 复制代码
person:
  name: 张三
  age: 18
  birthDay: 2010/10/10 12:12:12
  like: true
  child:
    name: 李四
    age: 20
    birthDay: 2018/10/10
    text: ["abc","def"]
  dogs:
    - name: 小黑
      age: 3
    - name: 小白
      age: 2
  cats:
    c1:
      name: 小蓝
      age: 3
    c2: {name: 小绿,age: 2} #对象也可用{}表示

小技巧:lombok

简化JavaBean 开发。自动生成构造器、getter/setter、自动生成Builder模式等

xml 复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>compile</scope>
</dependency>

使用@Data等注解

相关推荐
葫芦和十三3 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp3 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑4 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯5 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan7 小时前
多Agent之间的区别
后端
青石路9 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充9 小时前
1.面向对象设计思想
后端
IT_陈寒9 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro10 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗10 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端