算法合集(持续更新)
- 数学
- 最短路径
- 二分 + BFS
- 并查集
- 线段树
- 记忆化搜索
- 单例模式
文章主要介绍SpringBoot日志门面与系统,详细说明LogBack
spring-boot-starter-validation相关的参数校验
多线程可以提升任务的执行效率,但是多线程由于隔离程度不够,会出现多个线程同时操作同一变量使得变量值不可控的情况,也就是线程安全问题。
线程安全问题出现的场景:
一般来说解决问题就是需要破坏三个条件中的一个,锁就是将多线程访问变量的过程串行化,破坏多线程环境。另外还可以通过创建副本的方法来破坏第二个条件,lua脚本将多个redis操作合并成原子操作破坏第三个条件。
java中锁的实现大体分两种,分别是基于Monitor
的synchronized
和基于AQS
的ReentrantLock
,这篇文章先来总结一下synchronized的使用与实现
SpringBoot自动装配 = 模块装配 + 条件装配
@SpringBootApplication
上标注了@EnableAutoConfiguration
,这自动装配的起点。
导入starter及Spring运行需要的类
@EnableAutoConfiguration
上标注了@Import(AutoConfigurationImportSelector.class)
根据模块装配规则AutoConfigurationImportSelector
的父类实现了ImportSelector
接口,重写了selectImports()
方法。
Spring内部通过层层过滤,最终委托给SpringFactoriesLoader
中loadFactoryNames()
方法来调用loadSpringFactories()
,并过滤返回值key是EnableAutoConfiguration
的value
loadSpringFactories()
方法会解析资源目录下”META-INF/spring.factories”文件,并将数据封装成Map类型
之后将得到的数据层层返回上去,在selectImports()返回要加载的类名(也就是META-INF/spring.factories文件中定义的EnableAutoConfiguration的类)
导入自己编写的Bean
@AutoConfigurationPackage
上标注了@Import(AutoConfigurationPackages.Registrar.class)
实现了
ImportBeanDefinitionRegistrar接口,重写了
registerBeanDefinitions()`方法。registerBeanDefinitions()
会调用register()
方法来注册PackageImports
中封装的包名PackageImports
会解析是否配置需要扫描的包名,默认是启动类所在包