第一个SpringBoot程序
1. 创建方法
-
可以在官网直接下载后, 导入idea开发
-
直接使用idea创建一个springboot项目(一般开发直接在idea中创建)
2. 第一个程序
package com.wang.helloWorld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//本身就是Spring的一个组件!
//程序的主入口
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
//SpringApplication
SpringApplication.run(HelloWorldApplication.class, args);
}
}
controller
package com.wang.helloWorld.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//自动装配
@RestController
public class HelloController {
//接口: http://localhost:8080/hello
@RequestMapping("/hello")
public String Hello() {
//调用业务, 接收前端的参数
return "Hello, World!";
}
}
注意
- 代码要在和application同级的目录下建文件夹,否则会无法生效!
3. 修改port和banner
1. 修改port
在resource目录下的application.properties文件中
#更改项目的端口号
server.port=8081
2. 修改banner
在resource的目录下新建banner.txt, 放入直接喜欢的banner即可!
4. 原理初探
1. 自动配置
1. pom.xml
-
spring-boot-dependencies: 核心依赖在父工程中
-
我们在写或引入一些springboot依赖的时候, 不需要指定版本, 就因为有这些版本仓库!
2. 启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 启动器就是springboot的启动场景
- 比如spring-boot-starter-web, 会帮我们自动导入web的所有依赖
- springboot会将所有的功能场景, 变成一个个的启动器
- 我们要使用什么功能, 就只需要找到对应的启动器即可
3. 主程序
package com.wang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//@SpringBootApplication : 标注这个类是一个springboot的应用, 启动类下的所有配置导入
@SpringBootApplication
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
//将springboot应用启动
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
注解
-
@SpringBootConfiguration : springboot的配置
- @Configuration : spring配置类(用java注解配置, 不用xml)
- @Component : 说明这也是一个spring组件
-
@EnableAutoConfiguration : 自动配置
-
@AutoConfigurationPackage : 自动配置包
- @Import(AutoConfigurationPackage.Registrar.class) : 自动配置 包注册
-
@Import(AutoConfigurationImportSelector.class) : 自动配置导入选择
-
getCandidateCOnfiguration(annotationMetadata, attributes) : 获取候选的配置
-
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }
-
-
-
META-INF/spring.factories : 自动配置的核心文件
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
所有的资源加载到配置类中
4. 原理图
![SpringBoot自动配置原理](https://gitee.com/hello-world-cn/pic_-repo/raw/master/pic/20200916152236.jpg)
5. @ConditionalOnXXX
-
核心注解, 这个注解是自动配置没有全部生效而需要导入对应的start才生效的原因!
-
@ConditionalOnXXX(XXX, XXX, ...) 括号中的条件都满足这个类才生效
-
XXX: Class, Property, ...
6. 结论
SpringBoot所有的自动配置都在启动类中扫描并加载
扫描了spring.factories, 所有的自动配置类都在这里面, 但不一定生效
要看判断条件是否成立(@ConditionalOnXXX), 只要导入了对应的starter(pom), 就有对应的启动器了
有了启动器, 我们自动配置就会生效, 然后就配置成功了
步骤:
- SpringBoot在启动的时候, 从类路径/META-INF/spring.factories 获取了指定的值
- 将这些自动配置的类导入容器, 自动配置类就会生效, 帮我们自动配置
- 以前我们需要手动配置的东西, 现在SpringBoot帮我们做了
- 整合JavaEE, 解决方案和自动配置的东西都在spring-boot-autoconfigure-版本号.RELEASE .jar这个包下
- 它会把所有需要导入的组件, 以类名的方式返回, 这些组件就会被添加到容器
- 容器中也会存在非常多的XXXAutoConfiguration的文件, 就是这些类会给容器中导入这个场景需要的所有组件, 并自动配置@Configuration (JavaConfig!)
- 有了自动配置类, 免去了我们手动配置类的麻烦
2. Spring主程序启动
1. SpringApplication类
这个类主要做了四件事情
-
推断应用的类型是普通的项目还是Web项目(Web项目会一直运行)
-
查找并加载所有可用初始化器 , 设置到initializers属性中
-
找出所有的应用程序监听器,设置到listeners属性中
-
推断并设置main方法的定义类,找到运行的主类
- SpringApplication.run(主类.class, args);
2. run方法
核心是利用Java来配置 JavaConfig
其中的核心是@Configuration和@Bean
3. SpringBoot的理解
- 自动装配
- run方法
- 判断是否为web项目
- 找到运行的主类
- 监听器
- 主要还是SpringApplication类做的四件事