算法合集(持续更新)
- 数学
 - 最短路径
 - 二分 + 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会解析是否配置需要扫描的包名,默认是启动类所在包