目录
2. 引入 spring-boot-starter-parent 和 spring-boot-starter-web 依赖

spring-boot-starter-parent是 Spring Boot 提供的一个用于构建 Spring Boot 项目的父项目(Parent Project)。通过使用spring-boot-starter-parent作为项目的父项目,你可以继承 Spring Boot 默认的依赖管理、插件配置和默认配置等(这是必要的,如果缺省Maven 将会默认使用),从而简化项目的配置和构建过程。
spring-boot-starter-web是 Spring Boot 提供的一个用于构建 Web 应用程序的起步依赖(Starter Dependency)。通过引入spring-boot-starter-web,你可以快速地构建基于 Spring MVC 的 Web 应用程序,无需手动管理依赖和配置。
-
- <parent>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-parentartifactId>
- <version>3.0.5version>
- parent>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- dependencies>
- package org.example;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class MainApplication {
- public static void main(String[] args) {
- SpringApplication.run(MainApplication.class,args);
- }
- }
- package org.example.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.bind.annotation.RestController;
-
-
- //@ResponseBody // 标记返回纯文本
- //@Controller // 标识一个类作为控制器,用于处理 HTTP 请求并返回相应的视图或数据
-
- @RestController // 以上两个注解的合成注解
- public class HelloController {
-
- @GetMapping("/hello")
- public String hello(){
- return "Hello,Spring Boot 3!";
- }
- }

-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- plugin>
- plugins>
- build>


打包成jar包后,可以直接在CMD中直接使用Java -jar运行。
D:\JavaCode\app-demo>Java -jar boot3-01-demo-1.0-SNAPSHOT.jar

1. 简化整合
导入相关的场景,拥有相关的功能。场景启动器
默认支持的所有场景:Developing with Spring Boot
- 官方提供的场景:命名为:
spring-boot-starter-*- 第三方提供场景:命名为:
*-spring-boot-starter场景一导入,万物皆就绪
- 开发什么场景,导入什么场景启动器。
- 导入“场景启动器”。 场景启动器 自动把这个场景的所有核心依赖全部导入进来。
2. 简化开发
无需编写任何配置,直接开发业务
3. 简化配置
application.properties:
- 集中式管理配置。只需要修改这个文件就行 。
- 配置基本都有默认值
- 能写的所有配置都在: Common Application Properties
4. 简化部署
打包为可执行的jar包。
linux服务器上有java环境。
5. 简化运维
修改配置(外部放一个application.properties文件)、监控、健康检查。

一键创建好整个项目结构

自定义版本号
properties标签中声明父项目用的版本属性的key,遵循就近原则。@SpringBootApplication 标注的类就是主程序类@ComponentScan("com.atguigu") 直接指定扫描的路径非正确主从位置:
执行结果:

自定义扫描路径:
- package org.example.boot;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.SpringBootConfiguration;
- import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.annotation.ComponentScan;
-
-
- //@SpringBootApplication(scanBasePackages = "org.example")
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan("org.example")
- public class Boot302DemoApplication {
-
- public static void main(String[] args) {
- //java10: 局部变量类型的自动判断
- var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
-
- //1、获取容器中所有组件的名字
- String[] names = ioc.getBeanDefinitionNames();
-
- //2、挨个遍历:
- // dispatcherServlet、beanNameViewResolver、characterEncodingFilter、multipartResolver
- // SpringBoot把以前配置的核心组件现在都给我们自动配置好了。
- for (String name : names){
- System.out.println(name);
- }
- }
-
- }
@SpringBootApplication(scanBasePackages = "org.example")
等于以下三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("org.example")
自定义扫描路径后:

ServerProperties绑定了所有Tomcat服务器有关的配置MultipartProperties绑定了所有文件上传相关的配置
配置文件的所有配置项是和某个类的对象值进行一一绑定的:

spring-boot-starter-webspring-boot-starter,是所有starter的starter,基础核心starterspring-boot-starter导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类spring-boot-autoconfigure这个包,但是不是全都开启的。
SpringBoot摒弃XML配置方式,改为全注解驱动
@Configuration、@SpringBootConfiguration
@Bean、@Scope
@Controller、 @Service、@Repository、@Component
@Import
@ComponentScan
@Configuration:这是一个配置类,@Configuration 注解表示该类是一个配置类,其中包含用于配置 bean 的方法。
@Bean:申明这是一个bean类,告诉 Spring 容器要将某个实体类的实例作为一个 bean 注册到容器中。
@Scope :用于指定 Spring bean 的作用域。
- prototype:每次请求该 bean 时都会创建一个新的实例。每个实例都是独立的,没有共享状态。

- package org.example.boot.bean;
-
- public class User {
- private Long id;
- private String name;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- }
- package org.example.boot.bean;
-
- public class Cat {
- private Long id;
- private String name;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- }
- package org.example.boot.config;
-
- import org.example.boot.bean.User;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
-
- @Configuration // 这是一个配置类,@Configuration 注解表示该类是一个配置类,其中包含用于配置 bean 的方法。
- public class AppConfig {
-
- @Bean("hahabean") // Bean注解,申明这是一个bean类,告诉 Spring 容器要将某个实体类的实例作为一个 bean 注册到容器中
- public User user(){
- var user = new User();
- user.setId(1L);
- user.setName("zhangsan");
-
- return user;
- }
- }
主程序:
- package org.example.boot;
-
- import org.example.boot.bean.User;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.SpringBootConfiguration;
- import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.annotation.ComponentScan;
-
- @SpringBootApplication
- public class Boot302DemoApplication {
-
- public static void main(String[] args) {
- var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
-
- String[] names = ioc.getBeanNamesForType(User.class);
-
- for (String name : names){
- System.out.println(name);
- }
-
- Object bean1 = ioc.getBean("hahabean");
- Object bean2 = ioc.getBean("hahabean");
-
- System.out.println(bean1 == bean2);
-
- }
-
- }
执行结果:

@Import:向Spring容器中导入一个组件,默认组件名为全类名。
- package org.example.boot.config;
-
- import org.example.boot.bean.User;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Import;
- import org.springframework.context.annotation.Scope;
-
-
- @Import(CatConfig.class) // 向容器中导入一个组件,默认组件名为全类名
- @Configuration // 这是一个配置类,@Configuration 注解表示该类是一个配置类,其中包含用于配置 bean 的方法。
- public class AppConfig {
-
- @Scope("prototype")
- @Bean("hahabean") // Bean注解,申明这是一个bean类,告诉 Spring 容器要将某个实体类的实例作为一个 bean 注册到容器中
- public User user(){
- var user = new User();
- user.setId(1L);
- user.setName("zhangsan");
-
- return user;
- }
- }

如果注解指定的条件成立,则触发指定行为
@ConditionalOnXxx
@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
场景:
CatConfig这个 类,给容器中放一个Cat组件,名cat01,Dog组件,名dog01dog01这个 组件,就给容器中放一个 User组件,名zhangsan@ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

主程序:
- package org.example.boot;
-
- import org.example.boot.bean.Cat;
- import org.example.boot.bean.Dog;
- import org.example.boot.bean.User;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class Boot302DemoApplication {
-
- public static void main(String[] args) {
- //java10: 局部变量类型的自动判断
- var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
-
-
- for (String s : ioc.getBeanNamesForType(Cat.class)){
- System.out.println("cat:" + s);
- }
-
-
- for (String s : ioc.getBeanNamesForType(Dog.class)){
- System.out.println("Dog:" + s);
- }
-
- for (String s : ioc.getBeanNamesForType(User.class)){
- System.out.println("User:" + s);
- }
-
- }
-
- }
Dog.py:
- package org.example.boot.bean;
-
- public class Dog {
- private Long id;
- private String name;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- }
AppConfig2.py:
- package org.example.boot.config;
-
- import org.example.boot.bean.Cat;
- import org.example.boot.bean.Dog;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class AppConfig2 {
- @ConditionalOnClass(name="org.example.boot.config.CatConfig") // 如果类路径中存在这个类,则触发指定行为
- @Bean
- public Cat cat01(){
- return new Cat();
- }
-
- @ConditionalOnMissingClass(value="org.example.boot.config.CatConfig") // 如果类路径中不存在这个类,则触发指定行为
- @Bean
- public Dog Dog01(){
- return new Dog();
- }
-
-
- }
CatConfig.py:
- package org.example.boot.config;
-
- import org.example.boot.bean.Cat;
-
- public class CatConfig {
- public Cat cat(){
- var cat = new Cat();
- cat.setId(1L);
- cat.setName("zhangsan");
-
- return cat;
- }
- }
执行结果:

去掉 CatConfig 并注释掉AppConfig里的@import(CatConfig.class)注解,执行结果:

@Component:添加"@Component"注解,可以告诉Spring框架将该类实例化为一个Bean,并由Spring容器进行管理。
@ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定。
@EnableConfigurationProperties:快速注册注解。
将容器中任意组件(Bean)的属性值和配置文件(application.properties)的配置项的值进行绑定

pig.py:
- package org.example.boot.bean;
-
- import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
-
- //@Component
- public class Pig {
- private Long id;
- private String name;
- private Integer age;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- @Override
- public String toString() { //重写 toString() 方法,返回了包含对象的 name 和 age 属性的字符串表示形式。
- return "Pig{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
去掉@Component也可以实现相同的功能,在AppConfig.py配置类里加入:
- @Bean
- public Pig pig(){
- return new Pig();
- }
两种方法的目的都是为了将pig组件加入 spring 容器。
在主方法里加入:
- Pig pig = ioc.getBean(Pig.class);
- System.out.println("pig:" + pig);
执行结果:

sheep.py:
- package org.example.boot.bean;
-
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
- @ConfigurationProperties(prefix = "sheep")
- public class sheep {
- private Long id;
- private String name;
- private int age;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- @Override
- public String toString() {
- return "sheep{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
在AppConfig.py主类上加上@EnableConfigurationProperties(value = sheep.class)
在主方法里加入:
- sheep sheep = ioc.getBean(sheep.class);
- System.out.println("sheep:" + sheep);
执行结果:
