目录
一、引言
1.1 初始化配置
为了使用SSM框架去开发,准备SSM框架的模板配置。
1.2 整合第三方框架
为了Spring整合第三方框架,单独的去编写xml文件。
1.3 后期维护
后期SSM项目后期xml文件特别多,维护xml文件的成本是很高的
1.4 部署工程
SSM工程部署也是很麻烦,依赖第三方的容器
1.5 敏捷式开发
基于Java的SSM开发方式是很笨重,而现在的python,php,NodeJS的敏捷式开发已经盖过Java一头
二、SpringBoot介绍
SpringBoot是由Pivotal团队研发的,SpringBoot并不是一门新技术,只是将之前常用的Spring,SpringMVC,data-jpa等常用的框架封装到了一起,帮助你隐藏这些框架的整合细节,实现敏捷开发。
SpringBoot就是一个工具集。
SpringBoot特点:
SpringBoot项目不需要模板化的配置。
SpringBoot中整合第三方框架时,只需要导入相应的starter依赖包,就自动整合了。
SpringBoot默认只有一个.properties的配置文件,不推荐使用xml,后期会采用.java的文件去编写配置信息。
SpringBoot工程在部署时,采用的是jar包的方式,内部自动依赖Tomcat容器,提供了多环境的配置。
后期要学习的微服务框架SpringCloud需要建立在SpringBoot的基础上。
三、spring boot
使用的版本是: 2.6.8, 暂不要使用spring boot3.x版本.
官方文档: Spring Boot
spring boot的整个文档:
3.1 搭建一个spring boot工程
必须会这种.
-
新建一个java se的maven工程.
-
spring boot的依赖.
<!-- 注意,这个标签是parent, 表示当前的父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.8</version>
</parent>
-
引入一个组件, spring boot starter web.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
-
创建一个启动类.
/**
* @author 听忆
*/
@SpringBootApplication // 表示我是一个启动类.
public class MyApplication {
// 通过main启动当前的spring boot工程.
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
-
编写一个控制器的方法
原则: 之前怎么写这里还是怎么写,一点变化都没有.
/**
* @author 听忆
*/
@RestController
public class UserController {
@GetMapping("/hello")
public String hello(){
return "你好啊,spring boot";
}
}
3.2 使用idea创建项目
3.3 在线创建姿势
通过start.spring.io或者start.aliyun.com,可以在网页端进行项目的创建,然后下载创建的压缩包解压之后,导入到idea当中即可;
注意事项:
-
如果start.spring.io无法访问,「在idea当中」, 则可以尝试去修改idea的配置为:
start.aliyun.com
, 然后按照后续流程进行创建项目. -
目前版本号是: 2.6.8
3.4 项目的目录结构
咱们手动创建的项目, 这个结构就是一个标准的javaSE工程,没有配置文件.如果用这种方式,我们会手动去创建这些个目录. –> 之后会使用这种方式.
采用idea内置的方式创建,给我们生成了:
resouce
static
templates
applicaton.properties –> 文件名称不能修改.
3.5 项目的运行方式
开发阶段,一般情况我们都使用idea直接运行.
测试/上线 –> 打包
使用maven,必须得安装上打包插件.
<!-- 打包插件, 将当前的工程,打包成xxx.jar包。必须得有此插件。 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
注意事项:
如果你这个报红, 但是咱们如果不打包的话,则直接将它删除掉.打包必须得下载成功.
如果实在下载不了,拷贝一个,放到自己maven本地仓库.
==特别重要的注解:==
@SpringBootApplication就是一个组合注解: - @SpringBootConfiguration就是@Configuration注解,代表启动类就是一个配置类。 - @EnableAutoConfiguration帮你实现自动装配的,SpringBoot工程启动时,运行一个SpringFactoriesLoader的类,加载META-INF/spring.factories配置类(已经开启的),通过SpringFactoriesLoader中的load方法,以for循环的方式,一个一个加载。 - 好处:无需编写大量的整合配置信息,只需要按照SpringBoot提供好了约定去整合即可。 - 坏处:如果说你导入了一个starter依赖,那么你就需要填写他必要的配置信息。 - 手动关闭自动装配指定内容:@SpringBootApplication(exclude = QuartzAutoConfiguration.class) - @ComponentScan就相当于<context:component-scan basePackage=“包名” />,帮助扫描注解的。
复合注解。
实现包扫描, 自动装配。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited // 四个元注解
------------------------------
@SpringBootConfiguration // sprnig自动装配
@EnableAutoConfiguration // 启动spring 自动装配
// 包扫描配置
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
-------------------------------------------
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
自动装配. xxxAutoConfiguration, --> 自动装配的类. xxxProperties --> 在配置文件当中,要覆盖的属性.
以spring mvc为例,查看一下自动装配和我们自定义配置如何做的.
每一个组件都会有: xxxAutoConfiguration, 必须要有的.相当于一个规范.
@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class)
// 开启配置
@EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
通过观察发现了: 有两个xxxProperties的文件.这个文件就是: 我们可以在配置文件当中: application.properties文件进行属性覆盖的文件.也就是说, 在xxxProperties文件当中,全部都是默认的配置项.如果我们想更改这些个默认的配置,则只需要, 直接通过: 前缀.属性名称=值 进行覆盖即可;
@ConfigurationProperties(prefix = "spring.mvc") // 定义一个, 在application.properties文件当中,进行配置的前缀.
// 通过前缀.属性名称 = 值,覆盖当前这个配置类的相关属性.
public class WebMvcProperties {
}
spring.mvc.view.prefix=/pages/xx # 在配置文件当中,覆盖view.prefix
spring.mvc.view.suffix=.jsp # 在配置文件当中, 覆盖view.suffix
==xxxAutoConfiguration.java==
==xxxProperties.java==
对于这些类的加载.它是有条件的,当符合装配条件,则spring boot才会去加载.并且进行自动装配.如果不符合条件,则不加载.使用起来更加灵活.
类似于:
ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
@ConditionalOnClass(RedisOperations.class)
3.6 yml文件格式
一般情况下,我们都写: application.yml这种姿势的,但是实际也可以写: application.yaml格式.更推荐: yml文件格式的.
也可以配置一些数据或者集合
# 表示配置一个数组或者集合.注意:
# -空格 值
# tingyi.student
tingyi:
student:
- 张三
- 李四
- 王五
集合或者数组的表示方式.
如果同时使用application.properties文件,和application.yml文件,则生效的是 :applicaton.properties文件.
3.7 多环境配置
实际工作当中有三个环境:
开发环境,就是我们程序员自己的开发环境.
测试环境, 测试的同学们,使用的一种环境,可能跟这个开发环境还一样.
生产环境, 对外给用户用的环境.「线上环境」
生产需要, 从开发环境的数据库.要切换到测试环境的数据,怎么来做方便一些.你不能直接修改配置配置. 此时就需要我们在开发阶段就将这个多环境配置好.这样我们打包之后,就可以在运行的时候,方便的切换各种各样的环境;
测试, 修改端口号:
开发环境: 9000
application-dev.yml
测试环境: 9001
application-test.yml
生产环境: 9002
application-prod.yml
加载的配置文件
application.yml, 在这个文件当中咱们可以指定一个环境.
多环境配置的写法总结:
配置环境这样写:
application-{环境名称}.yml
主配置文件当中对环境进行激活
spring: profiles: active: 环境名称在部署工程时,通过 java -jar jar文件 --spring.profiles.active=环境
3.8 配置类的使用
使用:
必须将类标记一注解: @Component, 将这个类对象放到容器当中.
添加配置类注解: @ConfigurationProperties(prfix=’要写在配置文件当中的前缀’)
必须得有getter/setter方法,方可配置.
用途:
在配置文件当中对我们的配置类的属性进行赋值了.也就是配置好了.
那么在其它类当中可以随意使用, 使用的时候,通过注解的姿势来获取配置在配置文件当中的配置类的属性的值;
@Value(‘前缀.配置类的属性名称‘)
如果不写配置类的,可以直接在配置文件当中进行字段相关配置也是可以的.
# 没有配置类,我们直接可以这样配置.
tingyi:
name: 听忆
sex: 男
address: 呀呼
tingyi并没有类与之相对应,只是我们手动搞了一个前缀,使用起来感觉跟咱们有配置的方式一毛一样.结果也是一样的.但是这样写的话,并不好.不方便维护,且前缀可以随意的更改的.因为有配置类的方式前缀已经约定好了.不能随意的更改.
用法.一毛一样,没有啥区别;
3.9 静态资源处理
public static class Resources {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
/**
* Locations of static resources. Defaults to classpath:[/META-INF/resources/,
* /resources/, /static/, /public/].
*/
private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
以上四个目录都可以配置静态资源.咱们可以放到任意一个静态资源目录.
访问的时候,不要访问静态资源的目录名称.
如果要修改的,不建议修改.