安装
创建
1、创建一个新项目
2、选择spring initalizr , 可以看到默认就是去官网的快速构建工具那里实现
3、填写项目信息
4、选择初始化的组件(初学勾选 Web 即可)
5、填写项目路径
6、等待项目构建成功
目录结构
src 主程序编写入口
target 包文件
pom.xml 框架配置文件
打包: maven--》package--》java -jar ./打包后的jar文件
跑起程序
在主程序的同级目录下,新建一个controller包,一定要在同级目录下,否则识别不到
2、在包中新建一个HelloController类
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello World";
}
}
自动装配-生命周期
-
pom.xml 存放框架核心依赖
-
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> // 这个为父依赖相当于继承了 <version>2.2.5.RELEASE</version> <relativePath/> </parent
-
以后我们导入依赖默认是不需要写版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了
-
-
主启动类
-
配置其他程序启动器
-
<dependency> <groupId>org.springframework.boot</groupId> <!-- 所有的springboot管理都是以下方:spring-boot-starter看开头--> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
spring-boot-starter 后面写的就是框架的使用场景,这里是web那么就是web的应用
-
框架的所有的场景都被封装成一个个启动器
-
-
@SpringBootApplication // 标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用 public class SpringBoot2Application { public static void main(String[] args) { // spring boot 应用启动 SpringApplication.run(SpringBoot2Application.class, args); } }
-
@SpringBootApplication 注解
-
@SpringBootConfiguration //作用:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类; @EnableAutoConfiguration // @EnableAutoConfiguration :开启自动配置功能.以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 ;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效 @ComponentScan( //这个注解在Spring中很重要 ,它对应XML配置中的元素。作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中 excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { // ...... }
-
-
总结
-
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
-
将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
-
整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
-
它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
-
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
-
自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中
-
-
精髓
-
1、SpringBoot启动会加载大量的自动配置类 2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中; 3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了) 4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可; xxxxAutoConfigurartion:自动配置类;给容器中添加组件 xxxxProperties:封装配置文件中相关属性;
-
SpringApplication及run方法
-
SpringApplication 起到的作用: 1、推断应用的类型是普通的项目还是Web项目 2、查找并加载所有可用初始化器 , 设置到initializers属性中 3、找出所有的应用程序监听器,设置到listeners属性中 4、推断并设置main方法的定义类,找到运行的主类
-
run方法
yaml配置注入(自定义配置)
-
两中配置文件方式
- application.properties : 语法结构 key=value
- application.yml : 语法结构 key: value
-
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了
-
优先级1:项目路径下的config文件夹配置文件 优先级2:项目路径下配置文件 优先级3:资源路径下的config文件夹配置文件 优先级4:资源路径下配置文件
yaml概述
-
主要为一种格式
-
// 正常键值对模式 server: prot: 8080 // 对象、Map(键值对) k: v1: v2: 行内写法 student: {name: qinjiang,age: 3} // 数组( List、set )用 - 值表示数组中的一个元素,比如: pets: - cat - dog - pig 行内写法 pets: [cat,dog,pig]
-
-
语法说明
- 空格不能省略
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 属性和值的大小写都是十分敏感的。
yaml注入配置文件(推荐使用)
-
aml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
-
person: name: 帅哥 age: 21 like: 篮球 map: {k1: v1,k2: v2} list: [20,30,40] dog: {name: 旺财,age: 11}\ $() // 占位符
-
实体类
-
@Component // 加载实例化 @ConfigurationProperties(prefix = "person") // 读取配置文件 public class Person { private String name; private int age; private String like; private Map<String,Object> map; private List<Object> list; private Dog dog;
-
-
tets测试入口方法
-
// 单元测试类 @SpringBootTest class SpringBoot2ApplicationTests { @Autowired 依赖注入 private Person person; @Test void contextLoads() { System.out.println(person); }
-
-
**@PropertySource (value=“calssath:filename”):**加载指定的配置文件;
-
@configurationProperties:默认从全局配置文件中获取值
-
@Validated 字段校验
- @Eamil
-
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加 2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下 3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性 4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
JSR303数据校验及多环境切换
-
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理
-
常见的参数
-
@NotNull(message="名字不能为空") private String userName; @Max(value=120,message="年龄最大不能查过120") private int age; @Email(message="邮箱格式错误") private String email; 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. @NotEmpty 检查约束元素是否为NULL或者是EMPTY. Booelan检查 @AssertTrue 验证 Boolean 对象是否为 true @AssertFalse 验证 Boolean 对象是否为 false 长度检查 @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 @Length(min=, max=) string is between min and max included. 日期检查 @Past 验证 Date 和 Calendar 对象是否在当前时间之前 @Future 验证 Date 和 Calendar 对象是否在当前时间之后 @Pattern 验证 String 对象是否符合正则表达式的规则 .......等等 除此以外,我们还可以自定义一些数据校验规则
多环境切换
-
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境
-
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本
-
例如: application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置 但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件; 我们需要通过一个配置来选择需要激活的环境: #比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试; #我们启动SpringBoot,就可以看到已经切换到dev下的配置了; spring.profiles.active=dev 或者 --- server: port: 8083 spring: profiles: dev #配置环境的名称 ---
Springboot WEB
静态资源
-
可识别的目录:
-
"classpath:/META-INF/resources/" "classpath:/resources/" "classpath:/static/" "classpath:/public/"
-
首页和图标
-
静态资源文件夹下的所有 index.html 页面;被 /** 映射。 比如我访问 http://localhost:8080/ ,就会找静态资源文件夹下的 index.html 新建一个 index.html ,在我们上面的3个目录中任意一个;然后访问测试 http://localhost:8080/
模板引擎
-
引入Thymeleaf
-
<!--thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-