SpringBoot
常常用到的模板
- html页面的模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<bodyL>
<h1>good job</h1>
</bodyL>
</html>
- 配置连接到数据库
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql//localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
一、微服务阶段
一、自动装配的原理
二、分布式开发
三、SpringCloud微服务
☆基础的知识点
-
重点要了解其中的原理,让自己能够有更多的谈资,自己主导面试官
-
you can “just run”
-
<groupId>com.wk</groupId> <artifactId>HelloWorld</artifactId> <version>0.0.1-SNAPSHOT</version>
gav坐标↑
-
依赖不用写版本,
spring-boot-dependencies 在父工程中,有版本的仓库
-
启动器:就是spirngboot的启动场景
-
springboot所有自动配置都是在启动的时候扫描并加载的;spring.factories所有的自动配置类都在这里,但不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后就配置成功了。
-
谈谈自己对springboot的理解,一是自动装配,二是run()方法
-
被@Component注解标识的类,会被纳入Spring容器中统一管理,好处是不用我们自己再new了,相当于注册了bean
-
在我们定义的属性上,可以加注解直接赋值,例如在pirvate String name;上面加上@Value(“wkwk”)就是给其赋值了
-
@Autowired注解是视同byType方式,根据属性类型寻找bean,可以与Component联合使用
-
我们导入的东西,按shift+shift一定能搜到properties
-
final关键词:如果用于修饰常量,那么该常量只能被赋值一次,之后便不会发生改变
如果修饰一个引用类型,对其初始化后,不在指向其他的对象了,但是其自身的内容是可以改变的 -
C=A>B ? 100 :200;
这条语句的意思是,如果A>B的话,就将100赋给C,否则就将200赋给C -
面试官问你你可以这样说,springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式祖册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面以什么什么EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器
-
在sb中,更新crud数据之后,自动提交
-
java类必须要有无参构造函数才能实现自动装配,否则会报错运行不了。
-
用自定义的视图解析器,自定义的国际化视图解析器的方法名必须是 localeResolver
-
关于restful风格传参
th:href=@{/emp/{id}(id=KaTeX parse error: Expected 'EOF', got '}' at position 15: {emp.getId()})}̲ th:href=@{/em…{emp.getId()})}
th:href=@{/emp/+${emp.getId()}} -
架构,就是为了解耦
☆All遇到的问题:
-
plugin可能爆红,原因应该是没配置好maven,简单地解决方法是自己手动导入依赖
<dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-site-plugin --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.8.2</version> </dependency>
-
无法直接双击package打jar包,解决方法手动导入插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-filtering</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
</plugin>
- 无法用idea创建springboot项目,解决方法见博客:
-
输入[localhost:8081/hello/hello]无法访问,原因是我们的main方法所在的calss没有放在,与controller同一级别的地方
-
我们用yaml方法配置参数后,导入依赖spring-boot-configuration-processor,输出显示为null,原因是没有把application.yaml放在最外层的文件中
-
松散绑定,给lastName,我们输出的last_name
-
在前面虽然已经加上了@Validation的情况下,但是@Email注解无法使用,解决方法是导入依赖【spring-boot-starter-validation】
-
修改网页默认的图标,不能用spring.mvc.favicon.enabled=false,而是用spring.favicon.enabled=false
-
用yaml配置数据库的时候,注意要将密码用双引号括起来
-
使用yaml的时候,一定注意,前面不要留有空格
-
springboot启动后,很快自己结束了,解决方法;导入org.springframework.boot依赖
-
import sun.misc.BASE64Decoder;包不存在
解决方法:file-> project structure -> 将java的jdk11 改为 jdk8
-
我们在用idea创建springboot项目之后,如果我们导入了过多的配置,可能会在启动run的时候报错,例如我们选择了sql,那么我们需要配置properties这种的
-
在dubbo-admin-master文件夹下使用cmd,然后输入mvn install -Dmaven.test.skip=true; 结果报错,解决方法:在pom.xml中,加上
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> </plugin>
-
心得体会,如果对一个错误搜索不到,那么试着更换关键词,特别是最最显眼的那些,单独拎出来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jWao7WY-1624702807603)(C:\Users\AW\Desktop\SpringBoot.assets\image-20210622214413100.png)]
二、第一个springboot程序
步骤:
- 在spring官网,点击quickstart,开始配置,然后打开idea,open这个文件
三、yaml语法
#application.properties与application.yaml的语法结构区别
#yaml对空格的要求十分高
#普通的key-value
#可以注入到我们的配置类中
name: wk
#对象
student:
name: wkwk
age: 3
#函内写法
student: {name: wkwk,age: 3}
#数组
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
四、SpringBoot的多环境配置
端口走哪个的优先性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UOqszm8o-1624702807606)(C:\Users\AW\Desktop\SpringBoot.assets\image-20210613152346217.png)]
五、SpringBoot Web开发
jar: webApp!
自动装配
springboot到底帮我们配置了什么?我们能不能修改,能修改哪些东西?能扩展吗?
- xxxxAutoCongifuration.想容器中自动配置组件
- xxxxProperties: 自动配置类,装配配置文件中自定义的一些内容
要解决的问题:
-
导入静态资源
static包下,templ ates下
-
首页
MyMvcConfig 、 index.xml、 list.html 、404.html 、dashboard.html 、 application.properties
-
jsp, 模板引擎Thymeleaf
-
装配扩展SpringMVC
-
增删改查
-
拦截器
-
国际化(中英文切换)
i18n包所有的文件、MyLocaleResolver、MyMvcConfig、index.xml
总结:
- 在sb中,我们可以使用以下方式处理静态资源
- webjars
- public, static , /** , resources
- 优先级:resources> static(默认)>public
六、Thymeleaf
怎么引入呢,对于springboot来说,什么事情不都是一个start的事情嘛,我们去在项目中引入一下。给大家三个网址:
Thymeleaf 官网:https://www.thymeleaf.org/
Thymeleaf 在Github 的主页:https://github.com/thymeleaf/thymeleaf
Spring官方文档:找到我们对应的版本
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
Themeleaf的相关配置文件,位于**templates(模板)**下面
结论:只要需要视同thymeleaf,只需要导入对应的依赖就行了,我们将html房子啊我们的templates下面
private String prefix = "classpath:/templates/";
//说明放在templates下面
2、标准表达式语法:
${...}
变量表达式,Variable Expressions
@{...}
链接表达式,Link URL Expressions
#{...}
消息表达式,Message Expressions
~{...}
代码块表达式,Fragment Expressions
*{...}
选择变量表达式,Selection Variable Expressions
七、正式进入Web开发
后台模板:bootstrap
后台模板:X-admin
@Repository :可以被spring托管
八、整合Mybatis
- 整合包:
mybatis-spring-boot-starter
- 配置文件
- mybatis配置
- 编写sql
- 业务层调用dao层
- controller调用service层
MVC
M:数据和业务
V :HTML
C :交接
九、SpringSecurity
安全应该在设计之初考虑
shiro、springSecurity:很想,除了类不一样,名字不一样
ss是一个框架
密码编码:PassowrdEncoder,新版的springsecurity多了许多加密方法
注销功能:http.logout()
整合包:thymeleaf与springsecurity
十、Shiro
十一、Swagger
-
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger官方API文档:https://swagger.io/
作用:- 接口的文档在线自动生成。
- 功能测试。
-
需要导入的依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
- 配置swagger信息=apiInfo
private ApiInfo apiInfo(){
//作者信息
Contact contact = new Contact("wk", "https://www.bilibili.com/", "277422545@qq.com");
return new ApiInfo(
"wk的SwaggerAPI文档",
"直接到B站吧,呜呜呜 ",
"v0.0",
"https://www.bilibili.com/",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList()
);
}
- Swagger配置扫描口
Docket select
//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//.enable(false)原来默认是ture,现在改成false之后,则不能打开了
.select()
//RequestHandlerSelectors配置要扫描接口的方法
//basePackage:指定要扫描的包
//any():扫描全部
//none():不扫描
//withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象
//withMethodAnnotation:扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.wk.swagger.controller"))
//path():过滤什么路径
.paths(PathSelectors.ant("/wk/**"))
.build();
}
- Swagger如何只在生产环境中使用,在发布的时候不使用?
- 判断是不是生产环境 flag=false
- 注入enable(flag)
public Docket docket(Environment environment){
//设置要显示的Swagger环境
Profiles profiles = Profiles.of("dev","test");
//获取项目的环境:
boolean flag = environment.acceptsProfiles(profiles);
- 配置API文档的分组
.groupName(“wkwk”)
- 如何配置多个分组文档
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("AA");
}
- 实体类配置
//@Api()注释
@ApiModel("用户实体类")//这是给实体类user的注释罢了
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
- 总结
- 可以通过swagger给一些比较难理解的属性或接口给予注释
- 接口文档实时更新
- 可以在线测试
Swagger几乎所有大公司都有使用
【注意点】在正式发布的时候,关闭Swagger,安全考虑,节省内存
十二、异步任务
目标:让前台能够秒刷新,后台会停一段时间再刷新
main方法:
@EnableAsync//开启异步处理
@SpringBootApplication
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
controller
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@RequestMapping("/hello")
public String hello(){
asyncService.hello();//停止三秒,转圈
return "OK";
}
}
service
@Service
public class AsyncService {
@Async//告诉你spring啊,这是一个异步方法,然后前台就不会停了,秒刷新,则只有后台会自己停3秒钟
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理。。。");
}
}
十三、邮件任务
- 导入依赖
<!-- 邮件任务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 配置application.properties
spring.mail.username=2774225452@qq.com
spring.mail.password=sldrlxneohcgdfhg
spring.mail.host=smtp.qq.com
#加密规则
spring.mail.properties.smtl.ssl.enable=true
- junit测试
@Test
void contextLoads() {
//one simple mail
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setSubject("哇卡哇卡你好啊");
mailMessage.setText("嘿嘿");
mailMessage.setTo("2774225452@qq.com");
mailMessage.setFrom("2774225452@qq.com");
mailSender.send(mailMessage);
}
@Test
void contextLoads2() throws MessagingException {
//one harder mail
MimeMessage mimeMessage = mailSender.createMimeMessage();
//组装
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setSubject("哇卡哇卡really");
helper.setText("<p style='color:red'how you doing?</p>",true);
//附件
helper.addAttachment("1.jpg",new File("C:\\Users\\AW\\Desktop\\1.jpg"));
helper.setTo("2774225452@qq.com");
helper.setFrom("2774225452@qq.com");
mailSender.send(mimeMessage);
}
- 定义邮件方法
/**
* @param html
* @param subject
* @param text
* @throws MessagingException
* @Author 哇卡哇卡
* */
public void sendMail(Boolean html,String subject,String text)throws MessagingException{
//one harder mail
MimeMessage mimeMessage = mailSender.createMimeMessage();
//组装
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setSubject("哇卡哇卡really");
helper.setText("<p style='color:red'how you doing?</p>",true);
//附件
helper.addAttachment("1.jpg",new File("C:\\Users\\AW\\Desktop\\1.jpg"));
helper.setTo("728038580@qq.com");
helper.setFrom("2774225452@qq.com");
mailSender.send(mimeMessage);
}
十四、定时任务
抢东西的脚本
Service层
@Service
public class ScheduledService {
//在一个特定时间执行这个方法~ Timer
//cron表达式
//秒 分 时 日 月 周几
//0 25 18 * * ?每天的18点25分执行
//30 0/5 10,18 * * 1-6 每月的周一到周六的10点和18点,每隔五分钟执行一次
//0 15 10 L* ? 每月最后一天的上午10点15执行
@Scheduled(cron = "0/2 * * * * ?")
public void hello(){
System.out.println("hello,你OK了");
}
}
main方法上面
@EnableAsync//开启异步处理
@EnableScheduling//!!开启定时的功能 !!
@SpringBootApplication
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
十五、分布式Dubbo+Zookeeper+Springboot
- 分布式系统是若干个独立计算机的集合,但是对于用户来说则就像一个系统一样
- 百度云,阿里云等等
- 从一台电脑的方法调用另一台电脑的方法
DUbbo
前台 中台 后端
-
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
-
dubbo官网 http://dubbo.apache.org/zh-cn/index.html
dubbo是一个监控后台,卡以查看我们注册了啥服务,
zookeeper是注册中心
dubbo:jar包
步骤:
- provider提供服务
- 导入依赖
- 配置注册中心地址,以及服务发现名,要扫描的包
- 在想要被注册的服务上面,增加一个注解@Service(config下面的)
- consumer如何消费
- 倒入依赖
- 配置注册中心的地址,配置自己的服务名
- 从远程注入
- 注意:@Service可能不同,显示config下的,后来是framework’下面的
ringboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
## 十五、分布式Dubbo+Zookeeper+Springboot
1. 分布式系统是若干个独立计算机的集合,但是对于用户来说则就像一个系统一样
2. 百度云,阿里云等等
3. 从一台电脑的方法调用另一台电脑的方法
DUbbo
前台 中台 后端
1. Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:**面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。**
2. dubbo官网 http://dubbo.apache.org/zh-cn/index.html
3.
dubbo是一个监控后台,卡以查看我们注册了啥服务,
zookeeper是注册中心
dubbo:jar包
步骤:
1. provider提供服务
1. 导入依赖
2. 配置注册中心地址,以及服务发现名,要扫描的包
3. 在想要被注册的服务上面,增加一个注解@Service(config下面的)
2. consumer如何消费
1. 倒入依赖
2. 配置注册中心的地址,配置自己的服务名
3. 从远程注入
4. 注意:@Service可能不同,显示config下的,后来是framework'下面的