理解
bean
- spring 容器中的对象。在Spring中,Bean的是一个非常广义的概念,是Spring管理的基本单位,Java对象、Java组件、数据源、Hibernate的SessionFactory、事务管理器都被当成Bean处理。
容器
- 可以理解为是一个大工厂,管理bean 的生命周期。
- 容器最基本的接口就是BeanFactory负责配置、创建、管理Bean。BeanFactory接口包含以下几个基本方法:
Boolean containBean(String name):判断Spring容器是否包含id为name的Bean实例。
<T> getBean(Class<T> requiredTypr):获取Spring容器中属于requiredType类型的唯一的Bean实例。
Object getBean(String name):返回Sprin容器中id为name的Bean实例。
<T> T getBean(String name,Class requiredType):返回容器中id为name,并且类型为requiredType的Bean
Class <?> getType(String name):返回容器中指定Bean实例的类型。
上下文
- BeanFactory有一个子接口ApplicationContext,称为上下文。可以对bean进行管理操作,允许容器通过应用程序上下文环境创建、获取、管理bean。
- ApplicationContext常用的实现类
ClassPathXmlApplicationContext:可以加载类路径下的配置文件,要求配置文件必须在类路径之下。
FileSystemXmlApplicationContext:可以加载磁盘中任意路径下的配置文件,要求具有访问权限。
AnnotationConfigApplicationContext:用于读取注解创建容器。
自动配置
依赖管理
- 最顶级(外层)父项目申明模块。
- common项目引入springboot的父项目管理依赖版本、引入spring-boot-starter-*场景启动器,这些都是通用的。
容器功能
组件添加
@Configuration
- 声明类为一个配置类,可以在此类中声明一个或多个 @Bean标注的方法。
- 配置类本身也是一个组件。
@bean
- 作用于方法,想在方法里面将第三方的类变成组件时使用。
- 当要向容器中注入多个相同类型的组件时,可以利用name属性进行区分。
@Resource
- 根据name取值时,会优先找注解name标明的组件,找不到找和组件名相同的。
@Component、@Controller、@Service、@Repository/@Mapper
@import
- 写在任意一个组件上都行,组件名默认是类名。
- importSelector:自定义返回@import标注的组件
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d043d538ed9a8019841389046ee7165e.png)
配置绑定
- @ConfigurationProperties + @Component
- @ConfigurationProperties + @EnableConfigurationProperties @EnableConfigurationProperties要写在配置类上才行
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b8dba372260f28af1d910bafcaf45dd4.png)
@Conditional 条件装配
@lmportResource
web开发
静态资源定制与自动化
- 静态资源放在
/static
,/public
,/resources
, /META-INF/resources
下,访问 : 当前项目根路径/ + 静态资源名。 - 改变静态资源路径:
resources:
static-locations: [classpath:/haha/]
spring:
mvc:
static-path-pattern: /res
常用参数
@PathVariable
路径变量@RequestBody
获取请求体[POST]@RequestParam
获取请求参数@RequestHeader
获取请求头@CookieValue
获取Cookie值
拦截器
- miaosha: TestInterceptor类。
文件上传
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headerImg") MultipartFile headerImg,
@RequestPart("photos") MultipartFile[] photos) throws IOException {
log.info("上传的信息:email={},username={},headerImg={},photos={}",
email,username,headerImg.getSize(),photos.length);
if(!headerImg.isEmpty()){
String originalFilename = headerImg.getOriginalFilename();
headerImg.transferTo(new File("H:\\cache\\"+originalFilename));
}
if(photos.length > 0){
for (MultipartFile photo : photos) {
if(!photo.isEmpty()){
String originalFilename = photo.getOriginalFilename();
photo.transferTo(new File("H:\\cache\\"+originalFilename));
}
}
}
return "main";
}
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
springboot三大组件
servlet
- 处理客户端请求的动态资源,当我们在浏览器中输入一个地址回车跳转后,请求就会被发送到Servlet上进行处理。
- 生命周期:初始化:web服务器启动时或web服务器接收到请求时,初始化工作有init()方法负责执行完成;调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;销毁:停止服务器时调用destroy()方法,销毁实例。
- 默认使用tomcat作为servlet容器。
- 定制servlet容器:
filter
- 一个请求到达servlet之前预处理用户请求,也可以在请求离开servlet时处理http响应。
- 生命周期:启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;每一次请求时都只调用方法doFilter()进行处理;停止服务器时调用destroy()方法,销毁实例。
listener
- ApplicationListener:容器关闭,容器刷新,容器启动,容器停止。
- ServletRequestListener:监听请求。
- HttpSessionListener:监听 session 对象。
- 自定义监听器:链接
定制化组件
- 原理分析:场景starter - xxxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties – 绑定配置文件项。
- 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件。常用的就拦截器、跨域配置。
三大核心功能
IOC(控制反转、依赖注入、自动装配这个机制的理解)
- Spring自动管理依赖的对象,使用时不需要去创建依赖的对象(spring容器启动的时候,会把依赖、配置类或者xml文件配置好相应的类,spring会把你在配置文件中配置的类都初始化好,用的时候直接用就不用再去创建)。
- IOC和工厂模式的区别:IOC是使用了反射机制来动态的生成对象,工厂模式的对象生成是提前在工厂类中定死的,IOC更加灵活。
AOP(面向切面)
- 在不改变原有方法的基础上添加新功能,比如加操作日志、权限控制。
- 用法:定义一个切面类,配置在哪个包下面的方法执行前保存一下操作日志。或者定义一个注解,在标有这个注解的方法执行前判断当前登录的人有没有权限访问。
MVC
链接
概念
- 一种软件设计规范。它将数据业务处理、页面显示、请求接收分开。
- Model(模型):提供要展示的数据,包含数据的处理,一般包含:Value Object(数据Dao) 和 服务层(行为Service)。
- View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
-Controller(控制器):相当于调度员,接收用户请求,委托给Model进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。
核心组件
- 前端控制器:DispactherServlet 接收请求、响应结果,相当于转发器,它是SpringMVC框架最核心的组件,有了它就能减少其他组件之间的耦合度。(不需要程序员开发)根据配置的映射规则(根据请求的URL),找到对应的处理器。(不需要程序员开发)
- 处理器映射器:HandlerMapping 根据配置的映射规则(根据请求的URL),找到对应的处理器。(不需要程序员开发)
-
- 处理器适配器:HandlerAdapter 适配调用具体的处理器,并且执行处理器中处理请求的方法,执行完毕之后返回一个ModelAndView对象。
- 视图解析器:ViewResolver 会根据传递过来的ModelAndView对象进行视图解析,根据视图解析名解析称真正的视图View。(不需要程序员开发)
- 视图:View View是一个接口,它的实现类支持不同类型的视图。比如:JSP、freemarker、Thymeleaf等等
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2a90c62cd3a4d89beedb45173a49f97b.png)
(1)当用户通过浏览器发起一个HTTP请求,请求直接到前端控制器DispatcherServlet;
(2)前端控制器接收到请求以后调用处理器映射器HandlerMapping,处理器映射器根据请求的URL找到具体的Handler,并将它返回给前端控制器;
(3)前端控制器调用处理器适配器HandlerAdapter去适配调用Handler;
(4)处理器适配器会根据Handler去调用真正的处理器去处理请求,并且处理对应的业务逻辑;
(5)当处理器处理完业务之后,会返回一个ModelAndView对象给处理器适配器,HandlerAdapter再将该对象返回给前端控制器;这里的Model是返回的数据对象,View是逻辑上的View。
(6)前端控制器DispatcherServlet将返回的ModelAndView对象传给视图解析器ViewResolver进行解析,解析完成之后就会返回一个具体的视图View给前端控制器。(ViewResolver根据逻辑的View查找具体的View)
(7)前端控制器DispatcherServlet将具体的视图进行渲染,渲染完成之后响应给用户(浏览器显示)。
SpringBoot和SpringMVC的区别
- SpringBoot是一个脚手架,把很多东西自动化配置了,集成了大量常用的第三方配置(jdbc、tomcat等),让开发更方便。引入相应的依赖就可以用SpringMVC了
对spring的理解
日志
配置文件中配置
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/76ac6b99eccaf521be6cec7882f45344.png)
日志文件
logback.xml和logback-spring.xml的区别
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2d4240fc2b3124085529e3818c1252e5.png)
- logback-spring.xml支持根据不同的环境打印不同的日志:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/58c5a27e0e7195f879797f04c900c45f.png)
- 参考:miaosha项目-LogTestController
- 参考文章
link
JUnit5单元测试
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
常用注解
- @SpringBootTest:加上才能用容器里面的组件。
- @Test:表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明
任何属性,拓展的测试将会由jupiter提供额外测试 - @Timeout:表示测试方法运行如果超过了指定时间将会返回错误
- @DisplayName:为测试类或者测试方法设置展示名称,可以在视图窗口看到
- @RepeatedTest :表示方法可重复执行,下方会有详细介绍
- @ParameterizedTest:表示方法是参数化测试,下方会有详细介绍
- @BeforeEach:表示在每个单元测试之前执行
- @AfterEach:表示在每个单元测试之后执行
- @BeforeAII:表示在所有单元测试之前执行
- @AfterAII:表示在所有单元测试之后执行
- @Tag:表示单元测试类别,类似于JUnit4中的@Categories
- @Disabled:表示测试类或测试方法不执行,类似于JUnit4中的@lgnore
- @ExtendWith:为测试类或测试方法提供扩展类引用
快速失败![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fc574018efedfad49f1a3dce2cbcbf23.png)
指标监控
配置文件切换
- 默认配置文件
application.yml
任何时候都会加载。 - 指定环境配置文件
application-{env}.yml
。 - 激活指定环境
- 配置文件激活:
spring.profiles.active=prod
- 命令行激活:
java -jar xxx.jar --spring.profiles.active=prod --person.name=haha
(修改配置文件的任意值,命令行优先)
- Profile条件装配,同名配置项,profile配置优先。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3e1f9490c328f684f36c073668dabf8a.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/96ee4bede9ecdd68b67570dbc5d86104.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2da0c7b4912f615e34981a928c9c6784.png)
外部化配置
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8e15a5714e80216370e1dc7cf1284d59.png)
自定义start
spring.factories文件
- 当定义一个没有启动类的模块时,在本模块中spring.factories文件 + @import(@Configuration)把组件引入容器。
SpringBoot启动过程
- 构造一个SpringApplication的实例,构造SpringApplication的时候会进行初始化的工作(初始化监听器、初始化环境配置、构造容器)。—自己写的简化版
tomcat
maxThreads(最大线程数)
- 请求到达Web服务器会创建一个线程来处理该请求。
- 默认200。
accepCount(最大等待数)
- 能够接受的最大等待数,请求数达到最大线程数时,新的请求会放在等待队列中。
- 默认100。
maxConnections(最大连接数)
- 同一时间能够接受的最大连接数。
- 要大于maxThreads+acceptCount。
线程数的经验值
- 1核2g内存为200,线程数经验值200。
- 4核8g内存,线程数经验值800。
高效配置案例
server:
tomcat:
uri-encoding: UTF-8
#最大工作线程数,默认200, 4核8g内存,线程数经验值800
#操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。
max-threads: 1000
# 等待队列长度,默认100
accept-count: 1000
max-connections: 20000
# 最小工作空闲线程数,默认10, 适当增大一些,以便应对突然增长的访问量
min-spare-threads: 100