SpringBoot
javase:OOP
mysql:持久化
html+css+jquery+框架:视图
java:独立开发 MVC 三层架构网站:原始
ssm:框架:简化我们开发流程,配置也开始较为复杂
war:tomcat 运行
spring 再简化:SpringBoot-jar:内嵌 tomcat;微服务架构
服务越来越多:SpringCould
SpringBoot 快速入门
什么是 spring?
Spring 是为了解决企业级应用开发的复杂性而创建的,简化开发
spring 如何简化 Java 开发?
- 4 个策略:
- 基于 pojo 的轻量级和最小入侵编程
- 通过 IOC,依赖注入,和面向接口解耦合
- 基于切面(AOP)进行声明式编程
- 通过切面和模板(Template)减少样式代码
什么是 SpringBoot?
Spring Boot 是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简 化是指简化了 Spring 众多框架中所需的大量且繁琐的配置文件,所以 Spring Boot 是一个服 务于框架的框架,服务范围是简化配置文件。所以从本质上来说,Spring Boot 其实就是 Spring 框架的另一种表现形式。约定大于配置
SpringBoot优点:
- 简化开发,配置简单
- 内嵌式 web 项目
- 没有冗余代码生成和 xml 配置
springboot 原理
pom.xml
- spring-boot-dependencies:核心依赖在父工程
- 我们在写或引入依赖时,不需要指定版本,因为这些版本
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 启动器:就是 springboot 的启动场景
- 比如spring-boot-starter-web,他就会帮我们自动导入 web 环境所需要的依赖
- springboot 会将所有功能场景,变成启动器
- 我们使用什么功能,找到对应启动器就可
主程序
//@SpringBootApplication:标注这个类是一个 springboot的应用,启动类下所有资源被导入
@SpringBootApplication
public class Springbootdemo01Application {
//将 springboot 应用启动
public static void main(String[] args) {
SpringApplication.run(Springbootdemo01Application.class, args);
}
}
注解
@SpringBootConfiguration springboot 配置
@Configuration spring 配置
@Component 说明这也是一个 spring 注解
@EnableAutoConfiguration 自动配置
@AutoConfigurationPackage 自动配置包
@Import({Registrar.class}) 导入选择器:注册
@Import(AutoConfigurationImportSelector.class)
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);//获取所有配置
获取候选配置(核心方法)
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
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;
}
自动配置核心文件:spring-boot-autoconfigure-2.3.7.RELEASE.jar/META-INF/spring.factories
结论:springboot 所有的自动配置都是在启动时扫描并加载'spring.factories',所有的自动配置类都在里面,但是不一定生效,要判断条件是否成了,只要导入对应 start,就有对应启动器,有了启动器,就会自动装配,然后配置就成功了。
- springboot启动的时候从类路径下/META/INF/spring.factories 获取制定的值
- 将这些自动配置类导入容器,自动配置就会生效,帮我们进行配置
- 以前我们需要自动配置的东西,现在 springboot 帮我们做了
- 整个 javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.3.7.RELEASE.jar这个包下
- 他会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中
- 容器中也会存在非常多的 xxxAutoConfiguration 的文件(@Bean),就是这些类给容器中导入了整个场景需要的所有组件;并自动配置。
- 有了自动配置类,免去我们手动编写配置文件工作
启动类中SpringApplication所作的事情
- 推断应用类型是否为 WEB
- 加载所有可用初始化器
- 设置所有可用程序监听器
- 推断并设置 main 的定义类
yaml 使用
基础使用
#properties k=v,只能保存键值对
#yaml 是 k:v 对空格要求较高,能注入到配置类中
#普通的 key-value
name: zhangsan
#对象
student:
name: zhangsan
age: 18
#行内写法
people: {name:zhangsan,age:3}
#数组
pets:
- cat
- dog
- pig
pet: [cat,dog,pig]
可以给实体类赋值
- 实体类
@ConfigurationProperties作用:
- 将配置文件中配置的每一个属性的值,映射到这个组件中;
- 告诉 springboot 将本类中所有属性和配置文件相关的配置进行绑定
- 参数prefix = "person";将配置文件的 person 下的所有属性进行一一对应,
- !!!注意:只有这个组件是容器组件,才能使用这个注解
/**
* @ConfigurationProperties作用:配置 yalm 使用
* 将配置文件中配置的每一个属性的值,映射到这个组件中;
* 告诉 springboot 将本类中所有属性和配置文件相关的配置进行绑定
* 参数prefix = "person";将配置文件的 person 下的所有属性进行一一对应,
*
* !!!注意:只有这个组件是容器组件,才能使用这个注解
*/
@Component
@ConfigurationProperties(prefix = "person")
//@PropertySource(value = "classpath:application.properties")//加载指定配置文件
public class Person {
// @Value("${name}")使用 properties 取值
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private List<Object> list;
private Map<String,Object> map;
private Dog dog;
- YAML
person:
name: 张三
age: 3
happy: false
birth: 2020/01/01
list:
- code
- music
- sport
# 注意 key 后面空格
map: {k1: v1,k2: v2}
dog:
name: 旺财
age: 3
配置官方提供的依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
JSR303 校验
spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
导入依赖
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
将注解添加到需要校验的字段上
yaml多配置
#springboot 可以多环境配置,切换通过 active 激活
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
自动装配原理
-
springboot 启动会加载大量的自动配置类,这个类是通过通过@ springbootApplication下的@EnableAutoConfiguration中的,AutoConfigurationImportSelector类最终找到,装配META-INF/spring.factories
-
我们看我们需要的功能有没有在 springboot 默认下号的自动配置类中,若配置类中以及配置则可以按照规定格式直接使用,无序手动配置
-
给容器中自动装配添加组件的时候,会从 properties 中获取属性,我们只需要在配置文件中指定这些属性就可以了;
xxxxAutoConfiguration:自动配置类;给容器组件
xxxproperti:封装配置文件中的相关属性
(类似的配置类)
1.springboot 会自动装配,通过xxxAutoConfiguration类自动装配,
2.若修改默认值属性,通过xxxProperties类加载一些属性
3.xxxProperties类和配置文件绑定,我们就可以使用按照规则自定义配置了
debug=true 可以查看哪些配置类生效,哪些没生效,默认 false
一些常见的候选功能注解
SpringBoot Web 开发
- xxxxAutoConfiguration 向容器中自动配置组件
- xxxxproperties:自动配置类,装配配置文件中的自定义的一些内容
web 开发解决那些问题
- 导入静态资源问题
- 首页
- jsp,模板引擎 Thymeleaf
- 装配扩展 SpringMvc
- CRUD
- 拦截器
静态资源
在 springboot 中可以使用以下方式处理静态资源
- webjars (这里是通过 maven 资源依赖导入;https://www.webjars.org/) localhost:8080/webjars/
- resources/public;resources/static;resources/resource 访问路径 localhost:8080/资源名 即可访问注意不是 resources 包的根下
- 优先级 resource>static>public
- 自定义访问路径
thymeleaf模板引擎
- 导入依赖
<!-- thymeleaf,我们都是基于 3.x 开发-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
- 将 html 页面放在 Templates 目录下即可
- 具有使用
@Controller
public class HelloController {
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("msg", "<h1>hello,springboot</h1>");
model.addAttribute("users", Arrays.asList("张三","李四"));
return "test";
}
}
<!DOCTYPE html>
<!--需要导入-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--所有的 html 元素都可以被 thymeleaf 替换接管,th:元素名-->
<!--不转义 取值-->
<h1 th:text="${msg}"></h1>
<!--转义 取值-->
<h1 th:utext="${msg}"></h1>
<!--元素遍历 user 是遍历出来的每个元素-->
<h2 th:each="user:${users}" th:text="${user}"></h2>
</body>
</html>
- 结果
SpringBoot配置
在 springboot 看到xxxxConfigurer(类似WebMvcConfigurer)会帮助我们拓展配置
- 首页配置:注意点,所有页面的静态资源都需要使用 thymeleaf接管,url 使用@{}
- 页面国际化
springboot 整合 jdbc
springboot 整合 Mybatis
SpringSecurity
shiro 和 SpringSecurity:很像 除了类不一样,名字不一样
认证,授权
- 功能权限
- 访问权限
- 菜单权限
- —拦截器,过滤器:大量原生代码—— 冗余
SpringBoot任务
异步任务
我们通过注解可以告诉 spring这是异步任务,从而完成响应。
- service 层
@Service
public class AsyncService {
@Async//告诉 spring 这是异步的方法
public void test(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正在执行处理。。。。");
}
}
- controller
@EnableAsync//开启异步处理
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@RequestMapping("/test")
public String test() {
asyncService.test();
return "处理完成";
}
}
定时任务
@EnableScheduling//开启定时功能的注解 写在启动类上
@Scheduled //特定时间执行这个方法,写在方法上
//cron 表达式
//秒,分,时,日,月,周几
@EnableScheduling//开启定时功能的注解
@SpringBootApplication
public class Springboot05TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot05TestApplication.class, args);
}
}
@Service
public class ScheduleService {
//特定时间执行这个方法
//cron 表达式
//秒,分,时,日,月,周几
@Scheduled(cron = "0 54 12 * * ?")
public void test(){
System.out.println("test 已经执行了");
}
}
SpringBoot邮件任务
springboot中发送邮件的主要 bean 对象 JavaMailSender
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 配置文件
spring.mail.username=714860063@qq.com
spring.mail.password=授权码不是邮箱密码)
spring.mail.host=smtp.qq.com
#开启加密验证(qq 邮箱需设置)
spring.mail.properties.mail.smtl.ssl.enable=true
- 测试
@SpringBootTest
class Springboot05TestApplicationTests {
@Autowired
JavaMailSender javaMailSender;
@Test
void contextLoads(){
//简单邮件发送
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setSubject("主题");
mailMessage.setText("发送内容");
mailMessage.setTo("发送给谁");
mailMessage.setFrom("谁发送的邮箱");
javaMailSender.send(mailMessage);
}
@Test
void contextLoads2() throws MessagingException {
//复杂邮件邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);//参数 2 true 开启 多文件 格式
helper.setSubject("主题");
helper.setText("<p style='color:blue'>内容</p>",true);//开启 html 文本
// helper.addAttachment("名称", new File("文件地址"));//附近
helper.setTo("714860063@qq.com");
helper.setFrom("714860063@qq.com");
javaMailSender.send(mimeMessage);
}
}