SpringBoot学习笔记:springboot中相关细节

SpringBoot中相关细节


1、springboot的优点:
① 创建独立Spring应用 ② 内嵌web服务器 ③ 自动starter依赖,简化构建配置 ④ 自动配置Spring以及第三方功能 ⑤ 提供生产级别的监控、健康检查及外部化配置 ⑥ 无代码生成、无需编写XML

2、创建springboot项目
①创建maven项目,配置本地maven仓库地址,引入关键依赖:
alt
②编写controller层,创建主程序类@SpringBootApplication:
alt
③启动主程序类即可运行,不用本地装tomcat,springboot项目自带tomcat。

3、springboot简化配置:springboot把配置文件都抽取到了一个配置文件中(application.properties),在这个配置文件中可以进行tomcat 的一些配置,包括springmvc 的一些配置。yml 文件编辑格式。

4、简化部署:不再用war 包的打包方式,直接在pom 文件中 编写,然后package 打成jar 包 直接运行java -jar 文件.jar。

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

5、springboot特点:
①依赖管理:(1)父项目做依赖管理(2)开发导入starter场景启动器(3)无需关注版本号,自动版本仲裁(4)可以修改版本号

1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
2、在当前项目里面重写配置
    <properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>

1、见到很多 spring-boot-starter- * : *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
3、所有场景启动器最底层的依赖 spring-boot-starter

②自动配置:(1)自动配好tomcat(2)自动配好springmvc(3)自动配好web 常见功能,如:字符编码问题(4)默认的包结构(主程序所在包及其下面的所有子包里面的的组件都会被默认扫描,无需配置包扫描,若想要改变扫描,则需要@SpringBootApplication(scanBasePackages=“com.atguigu”) 来指定扫描路径)(5)各种配置拥有默认值(6)按需加载所有配置项

6、@Configuration 注解:①配置类里面使用@Bean 标注在方法上给容器注册组件,默认单实例。②配置类本身也是个组件。③@Configuration(proxyBeanMethods = true) 默认为true,则springboot获取到的就是代理对象调用方法。

@Configuration //告诉springBoot 这是一个配置类 ===配置文件
public class MyConfig {

    @Bean //给容器中添加组件,以方法名作为组件id。返回类型就是组件类型。返回的值,就是组件在容器中的实例。
    public User user01(){
        return new User("zhangsan",18);
    }

    @Bean("tom") //或者在@Bean注解中自定义组件id。
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

7、@Import 注解:(标注在类名上)给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名。

@Import({User.class,DBHelper.class})

8、@Conditional 注解:(可在类上,可在方法上)条件装配。满足Conditional 指定的条件,则进行组件注入。

@ConditionalOnBean(name = "tom")
@Bean
public User user01(){} //当容器中有名字为tom 的组件时,才给容器中 注入 user01 这个组件。

9、@ImportResource 注解:(标注在类上)可以把xml文件格式的bean 进行组件注入。

@ImportResource("classpath:bean.xml")

10、@Component + @ConfigurationProperties 注解: 配置绑定。配置在application.properties 中的属性,也能通过该注解拿到相应的值。用prefix 前缀 自定义指定名称。

11、只有在容器中的组件,才会有springboot 提供的强大功能。

12、@SpringBootApplication 注解 是由:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 三个注解合成而来:
①@SpringBootConfiguration :就是一个普通的@Configuration 配置类。
②@ComponentScan :包扫描,用来指定要扫描哪些包。
③@EnableAutoConfiguration : 是@AutoConfigurationPackage 和 @Import 这两个注解的合成。
(1)@AutoConfigurationPackage : 用@import 给容器中导入组件,但是是利用Registrar批量导入组件。将主程序所在包下的所有组件批量导入。
(2)@Import : spring-boot 一启动就加载127个 写死的 自动配置的类。最后会按需配置。

13、总结:
①SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
②每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
③生效的配置类就会给容器中装配很多组件
④只要容器中有这些组件,相当于这些功能就有了
⑤定制化配置:有两种方法:(1) 用户直接自己@Bean替换底层的组件(2)用户去看这个组件是获取的配置文件什么值就去修改

xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

14、开发小技巧
①lombok:(简化javaBean 的开发) 需要引入依赖、在idea中安装lombok插件。
(1)@Data:用来生成getter/setter方法。(2)@ToString :在编译该类时生成toString方法。(3)@AllArgsConstructor / @NoArgsConstructor :生成有参/无参构造器。(4)@Slf4j :日志生成。
②dev-tools:(热部署)需要引入依赖。不需要反复重启项目。ctrl + F9
③SpringInitailizr :(项目初始化向导)快速构件springboot项目,创建项目时才使用。

15、配置文件===yaml的用法:
①基本语法:(1)key: value;kv之间有空格(2)大小写敏感(3)使用缩进表示层级关系(4)缩进不允许使用tab,只允许空格(5)缩进的空格数不重要,只要相同层级的元素左对齐即可(6)’#‘表示注释(7)字符串无需加引号,如果要加,’'与""表示字符串内容 会被 转义/不转义
②引入依赖 spring-boot-configuration-processor 使yml 配置文件有提示:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

以下为:springboot中的 web 模块

16、简单功能分析:
①静态资源目录:类路径下的static、public、resources、META-INF/resources。(访问:当前项目根路径/ + 静态资源名)
alt
原理:静态映射/**
(1)请求进来,先去找controller 看能不能处理,不能处理的所有请求,又都交给静态资源处理器(去相应的目录里找),如果静态资源也找不到,则报404.
(2)静态资源访问前缀:默认无前缀。需要添加的话在yml中spring.mvc.static-path-pattern:/res/**。 则以后再去找静态资源则需要:当前项目根路径/res/静态资源名。
②欢迎页支持:(当成静态页显示:访问用localhost:8080/)
(1)在静态资源路径下:index.html
(2)在controller 能处理 /index

17、RESTFul 风格:
①在页面上要以表单 method=post 形式提交请求,且表单含有隐藏域

<input type="hidden" name="_method" value="DELETE or PUT"></input>

②在yml 配置文件中手动开启:mvc.hiddenmethod.filter.enabled: true
③springboot中 包含注解:@GetMapping、@PostMapping、@DeleteMapping、@PutMapping

18、请求映射原理:底层还是springmvc 的DispatcherServlet
①DispatcherServlet···FrameworkServlet···HttpServletBean···HttpServlet(继承树)
②在FrameworkServlet 中重写了原生的HttpServlet 的doGet 和doPost 方法。
③在FrameworkServlet 中调用了processRequest, 而processRequest 又调用了doService方法。 这个doService 在DispatcherServlet 中有具体的实现,最终是通过DispatcherServlet 中的doDispatch 来进行请求映射。
④doDispatch 方法会调用DispatcherServlet 中的getHandler 方法,能够获取到所有controller 中的所有@RequestMapping 注解的value值。先是找url ,若存在相同的url 再根据 请求方式来进行筛选。
⑤各种handlerMappings:
alt
19、普通参数与基本注解
①注解:
@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody
②Servlet API:
WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId
③复杂参数:
Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder
④自定义对象参数

20、参数处理原理:
①HandlerMapping 中找到能处理请求的 Handler (Controller.method())
②为当前 Handler 找一个适配器 HandlerAdapter:RequestMappingHandlerAdapter
③适配器执行目标方法并确定方法参数的每一个值。
在这里插入图片描述
④参数解析器:HandlerMethodArgumentResolver
alt
21、视图解析与模板引擎
①视图解析:springBoot 默认不支持jsp,需要引入第三方模板引擎技术实现页面渲染
②视图解析处理方式:转发、重定向、自定义视图
③模板引擎:thymeleaf

22、拦截器
①编写一个拦截器类实现HandlerInterceptor接口
alt
②配置拦截器注册到容器中(实现WebMvcConfigurer 接口的 addInterceptors方法,指定拦截规则)
alt
③验证拦截器

23、文件上传
①文件上传提交表单:
alt
②后台处理文件上传请求:
alt
③设置单个,多个最大文件配置:
alt
24、异常处理机制
①默认规则:
(1)默认情况下,springboot提供 /error 处理所有的错误映射
(2)对于机器客户端,他将生成 json 响应,其中包含错误,HTTP 状态和异常消息的详细信息,对于浏览器客户端,响应一个 “whitelabel” 错误视图,以html 格式呈现相同的数据。
(3)或者放在 静态资源 文件夹 templates/error 下面的4xx,5xx页面将会被自动解析。(这样所有的404和5xx 都会跳到相应的页面)
alt
(4)若要取出详细的错误信息,可以页面直接以取json数据的形式取出:${message}
alt
25、Web 原生组件注入(Servlet、Filter、Listener):
①在各个Servlet、Filter、Listener 上都需要添加各自的注解:@WebServlet、@WebFilter、@WebListener。
②并且在启动类上还需要加上注解@ServletComponentScan 才能使上面三类注解生效。

26、定制化原理:
定制化常见方式:Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件。

27、数据访问(SQL
①数据源的自动配置
(1)导入JDBC场景

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

(2)导入数据库驱动(boot已经给定了版本,若本地驱动版本太低,则需要修改)

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

②使用 Druid 数据源

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>
spring:
	datasource:
		url: jdbc:mysql://localhost:3306/ssm_crud
		username: root
		password: 981015
		driver-class-name: com.mysql.jdbc.Driver

③整合 Mybatis 操作
(1)引入第三方mybatis -starter

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

(2)指定mybatis 的全局配置文件、映射文件。
alt

注意:config-location 属性和 configuration 属性不能同时存在,因为是 同一个作用,配置的是相同的东西。所以可以不写全局配置文件,所有的mybatis的配置,都可以在 yml文件 mybatis下的 configuration 中进行配置。

④最佳实战:
(1)引入mybatis-starter
(2)配置application.yaml中,指定mapper-location位置即可
(3)编写Mapper接口并标注@Mapper注解
(4)简单方法直接注解方式
(5)复杂方法编写mapper.xml进行绑定映射
(6)在启动类上@MapperScan(“com.atguigu.admin.mapper”) 简化,其他的接口就可以不用标注@Mapper注解

28、单元测试
①引入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

②使用测试:
alt
③SpringBoot整合Junit以后。
● 编写测试方法:@Test标注(注意需要使用junit5版本的注解)
● Junit类具有Spring的功能,@Autowired、比如 @Transactional 标注测试方法,测试完成后自动回滚
④Junit5 常用注解:
● @Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
● @ParameterizedTest :表示方法是参数化测试,下方会有详细介绍
● @RepeatedTest :表示方法可重复执行,下方会有详细介绍
● @DisplayName :为测试类或者测试方法设置展示名称
● @BeforeEach :表示在每个单元测试之前执行
● @AfterEach :表示在每个单元测试之后执行
● @BeforeAll :表示在所有单元测试之前执行
● @AfterAll :表示在所有单元测试之后执行
● @Tag :表示单元测试类别,类似于JUnit4中的@Categories
● @Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
● @Timeout :表示测试方法运行如果超过了指定时间将会返回错误
● @ExtendWith :为测试类或测试方法提供扩展类引用

29、断言assertions(断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。)
①JUnit 5 内置的断言可以分成如下几个类别:检查业务逻辑返回的数据是否合理。
②简单断言:
alt

@Test
@DisplayName("simple assertion")
public void simple() {
     assertEquals(3, 1 + 2, "simple math");
     assertNotEquals(3, 1 + 1);

     assertNotSame(new Object(), new Object());
     Object obj = new Object();
     assertSame(obj, obj);

     assertFalse(1 > 2);
     assertTrue(1 < 2);

     assertNull(null);
     assertNotNull(new Object());
}

③数组断言:通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等

@Test
@DisplayName("array assertion")
public void array() {
 assertArrayEquals(new int[]{1, 2}, new int[] {1, 2});
}

④组合断言:assertAll 方法接受多个 org.junit.jupiter.api.Executable 函数式接口的实例作为要验证的断言,可以通过 lambda 表达式很容易的提供这些断言

@Test
@DisplayName("assert all")
public void all() {
 assertAll("Math",
    () -> assertEquals(2, 1 + 1),
    () -> assertTrue(1 > 0)
 );
}

⑤异常断言:在JUnit4时期,想要测试方法的异常情况时,需要用@Rule注解的ExpectedException变量还是比较麻烦的。而JUnit5提供了一种新的断言方式Assertions.assertThrows() ,配合函数式编程就可以进行使用。

@Test
@DisplayName("异常测试")
public void exceptionTest() {
    ArithmeticException exception = Assertions.assertThrows(
           //扔出断言异常
            ArithmeticException.class, () -> System.out.println(1 % 0));

}

⑥超时断言:Junit5还提供了Assertions.assertTimeout() 为测试方法设置了超时时间

@Test
@DisplayName("超时测试")
public void timeoutTest() {
    //如果测试方法时间超过1s将会异常
    Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));
}

⑦快速失败:通过 fail 方法直接使得测试失败

@Test
@DisplayName("fail")
public void shouldFail() {
 fail("This should fail");
}

30、前置条件(assumptions):JUnit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。

31、指标监控:SpringBoot Actuator
①简介:未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

②如何使用:
(1)● 引入场景
(2)● 访问 http://localhost:8080/actuator/**
(3)● 暴露所有监控信息为HTTP

31、Profile 环境切换
①创建多环境yml 配置文件,然后在主配置文件中切换:
alt
alt
②相关属性:
● 默认配置文件 application.yaml;任何时候都会加载
● 指定环境配置文件 application-{env}.yaml
● 激活指定环境
○ 配置文件激活
○ 命令行激活:java -jar xxx.jar --spring.profiles.active=prod --person.name=haha
■ 修改配置文件的任意值,命令行优先
● 默认配置与环境配置同时生效
● 同名配置项,profile配置优先

③还可以在某个类上添加 @profile(“prod”) 注解来表示,当环境为生产环境 prod 的时候,当前类才能够生效。

32、Springboot 启动过程
①● 创建 SpringApplication
○ 保存一些信息。
○ 判定当前应用的类型。ClassUtils。Servlet
○ bootstrappers:初始启动引导器(List):去spring.factories文件中找 org.springframework.boot.Bootstrapper
○ 找 ApplicationContextInitializer;去spring.factories找 ApplicationContextInitializer
■ List<ApplicationContextInitializer<?>> initializers
○ 找 ApplicationListener ;应用监听器。去spring.factories找 ApplicationListener
■ List<ApplicationListener<?>> listeners

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值