Spring AOP的实现原理

  • jdk动态代理
  • cglib动态代理
阅读全文 »

主要内容

  1. jvm垃圾回收
  2. class文件
  3. 类加载过程
  4. jvm内存模型
阅读全文 »

分布式场景下全局唯一id的生成方案,雪花算法、数据库自增、redis自增。

阅读全文 »

多线程可以提升任务的执行效率,但是多线程由于隔离程度不够,会出现多个线程同时操作同一变量使得变量值不可控的情况,也就是线程安全问题。

线程安全问题出现的场景

  • 多线程环境
  • 有共享数据
  • 有多条语句操作共享数据/单条语句本身非原子操作(比如i++虽然是单条语句,但并非原子操作)

一般来说解决问题就是需要破坏三个条件中的一个,锁就是将多线程访问变量的过程串行化,破坏多线程环境。另外还可以通过创建副本的方法来破坏第二个条件,lua脚本将多个redis操作合并成原子操作破坏第三个条件。

java中锁的实现大体分两种,分别是基于Monitorsynchronized和基于AQSReentrantLock,这篇文章先来总结一下synchronized的使用与实现

阅读全文 »

ThreadLocal

ThreadLocal主要是为了解决多线程间信息隔离的问题(创建副本,用空间换时间)。

1
2
3
4
//泛型为需要共享的数据的类型
public class ThreadLocal<T> {
...
}
阅读全文 »

SpringBoot自动装配 = 模块装配 + 条件装配

@SpringBootApplication上标注了@EnableAutoConfiguration,这自动装配的起点。

  1. 导入starter及Spring运行需要的类

    • @EnableAutoConfiguration 上标注了@Import(AutoConfigurationImportSelector.class)

    • 根据模块装配规则AutoConfigurationImportSelector的父类实现了ImportSelector接口,重写了selectImports()方法。

    • Spring内部通过层层过滤,最终委托给SpringFactoriesLoaderloadFactoryNames()方法来调用loadSpringFactories(),并过滤返回值key是EnableAutoConfiguration的value

    • loadSpringFactories()方法会解析资源目录下”META-INF/spring.factories”文件,并将数据封装成Map类型

    • 之后将得到的数据层层返回上去,在selectImports()返回要加载的类名(也就是META-INF/spring.factories文件中定义的EnableAutoConfiguration的类)

  2. 导入自己编写的Bean

    • @AutoConfigurationPackage上标注了@Import(AutoConfigurationPackages.Registrar.class)
    • 根据模块装配规则``AutoConfigurationPackages.Registrar实现了ImportBeanDefinitionRegistrar接口,重写了registerBeanDefinitions()`方法。
    • registerBeanDefinitions()会调用register()方法来注册PackageImports中封装的包名
    • PackageImports会解析是否配置需要扫描的包名,默认是启动类所在包
阅读全文 »
0%