学习春天の靴子(springBoot)

学习春天の靴子(springBoot)
Kitholt Frank学习春天の靴子(springBoot)
ps:以下笔记内容主要搬运自尚硅谷(雷神)的笔记
Chapter1—自动配置原理
1.1、依赖管理
- 父项目做依赖管理
1 | 依赖管理 |
- 开发导入starter场景启动器
1 | 1、见到很多 spring-boot-starter-* : *就某种场景 |
- 可以修改默认版本号
1 | 1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。 |
1.2、自动配置
1 | <dependency> |
自动配好SpringMVC
引入SpringMVC全套组件
自动配好SpringMVC常用组件(功能)
自动配好Web常见功能,如:字符编码问题
SpringBoot帮我们配置好了所有web开发的常见场景
默认的包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
无需以前的包扫描配置
想要改变扫描路径,@SpringBootApplication(scanBasePackages=“xxx”)
或者@ComponentScan 指定扫描路径
1 |
|
Chapter2—容器功能
2.1、组件添加
1、@Configuration
Full模式与Lite模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79#############################Configuration使用示例######################################################
/**
* 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
* 2、配置类本身也是组件
* 3、proxyBeanMethods:代理bean的方法
* Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
* Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
* 组件依赖必须使用Full模式默认。其他默认是否Lite模式
*
*
*
*/
//告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
/**
* Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
################################测试代码如下########################################
public class MainApplication {
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//3、从容器中获取组件
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
System.out.println("组件:"+(tom01 == tom02));
//4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
//如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
//保持组件单实例
User user = bean.user01();
User user1 = bean.user01();
System.out.println(user == user1);
User user01 = run.getBean("user01", User.class);
Pet tom = run.getBean("tom", Pet.class);
System.out.println("用户的宠物:"+(user01.getPet() == tom));
}
}
1 | * 4、 |
2、@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
2.2、配置绑定
1、@ConfigurationProperties
1 | /** |
2.3、按需开启自动配置项
1 | 虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration |
总结
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 —-> application.properties
Chapter3—配置文件
1、文件类型
1.2、yaml
1.2.1、简介
YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件
1.2.2、基本语法
key: value;kv之间有空格
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
‘#’表示注释
字符串无需加引号,如果要加,’’与””表示字符串内容 会被 转义/不转义
1.2.3、示例
1 |
|
1 | # yaml表示以上对象 |
2、配置提示
自定义的类和配置文件绑定一般没有提示。
1 | <dependency> |
Chapter4—Web开发
1.1、模板抽取(thymeleaf)
- 首先,根据需求提取出模板网页
- 在模板网页中,利用th:fragment=”xxx”将模板”碎片化“
- 然后在需要的网页中使用th:insert=“[模板名称]::[碎片名]”或th:replace=“[模板名称]::[碎片名]”或th:include=“[模板名称]::[碎片名]”
1.2、拦截器配置
配置拦截器
将拦截器注册到容器中(其实是先配置到一个config配置类中,然后容器再通过调用 配置类 来进行 装配)
必要时会指定拦截路径
1.2.1、拦截器原理(复习)
1、根据当前请求,找到**HandlerExecutionChain【**可以处理请求的handler以及handler的所有 拦截器】
2、先来顺序执行 所有拦截器的 preHandle方法
- 1、如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
- 2、如果当前拦截器返回为false。直接 倒序执行所有已经执行了的拦截器的 afterCompletion;
3、如果任何一个拦截器返回false。直接跳出不执行目标方法
4、所有拦截器都返回True。执行目标方法
5、倒序执行所有拦截器的postHandle方法。
6、前面的步骤有任何异常都会直接倒序触发 afterCompletion
7、页面成功渲染完成以后,也会倒序触发 afterCompletion
1.3、文件上传
1 | /** |
1.4、原生组件注入(Servlet、Filter、Listener)
该注解写在主程序类中
@ServletComponentScan(basePackages = “xxx”) :指定原生Servlet组件都放在那里
下列注解用来表示各个组件:
@WebServlet(urlPatterns = “/my”)
@WebFilter(urlPatterns={“/css/*“,“/images/*“})
@WebListener
1.4.1、利用RegistrationBean来注入组件
1 |
|
Chapter5—数据访问
导入JDBC场景
1 | <dependency> |
导入数据库驱动
1 | 默认版本:<mysql.version>8.0.22</mysql.version> |
另外,可以通过修改spring.jdbc来修改JdbcTemplate的相关值
测试:
1 | @Slf4j |
解决JdbcTemplate无法自动注入的问题:
1 | <dependency> |
只要不引入上面那个注释掉的依赖就可以了(我也不知道为什么,我给这个折磨了好一阵子了。。。)
使用Druid数据源
引入druid-starter
1
2
3
4
5<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>能够进行自动配置的相关属性
扩展配置项 spring.datasource.druid
DruidSpringAopConfiguration.class, 监控SpringBean的;配置项:spring.datasource.druid.aop-patterns
DruidStatViewServletConfiguration.class, 监控页的配置:spring.datasource.druid.stat-view-servlet;默认开启
DruidWebStatFilterConfiguration.class, web监控配置;spring.datasource.druid.web-stat-filter;默认开启
DruidFilterConfiguration.class}) 所有Druid自己filter的配置
使用mybatis
1 | <dependency> |
使用yaml配置mybatis(替代原先的mybatis-congfig.xml全局配置文件)
1 | # 配置mybatis规则 |
总的来说整合mybatis的操作和以前几乎一样
导入mybatis官方starter
编写mapper接口。标准@Mapper注解
编写sql映射文件并绑定mapper接口
在application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息 (建议;配置在mybatis.configuration)
mybatis-plus(mybatisX)不用手写crud了!
1 | <dependency> |
MybatisPlusAutoConfiguration 配置类,MybatisPlusProperties 配置项绑定。mybatis-plus:xxx 就是对****mybatis-plus的定制
SqlSessionFactory 自动配置好。底层是容器中默认的数据源
**mapperLocations 自动配置好的。有默认值。*classpath*:/mapper/*/*.xml;任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。 建议以后sql映射文件,放在 mapper下
容器中也自动配置好了 SqlSessionTemplate
@Mapper 标注的接口也会被自动扫描;建议直接 @MapperScan(“xxx”) 批量扫描就行
注意:
mybatis_plus 默认会使用 “id” 为主键字段,如果数据库的主键字段不是“id”的话,使用mybatis-plus中的 selectById ,getById 方法查询数据是查询不出来的。所以就会出现空指针…(折磨人,别问我为什么知道…)
解决方法:
在实体类的主键字段加上@TableId(value =“数据库你的主键字段”)注解即可




