通过阅读Spring源码,从简化版Spring了解spring运行机制
扫描指定包下面的类
扫描指定包下的所有类,听起来好像一时摸不着头脑,其实它等同于另一个问题:如何遍历文件目录?
那么存放类信息应该用什么呢?我们看看上面例子中getBean的方法,是不是像Map中的通过key获取value?而Map中还有很多实现,但线程安全的却只有一个,那就是ConcurrentHashMap(别跟我说HashTable)
定义存放类信息的map。
实例化
现在已经把所有适合的类都解析好了,实例化。
遍历classMap进行实例化Bean。
组合
两个核心方法已经写好了,接下把它们组合起来,我把它们实现在自定义的ApplicationContext类中,构造方法如下:
public ApplicationContext(Class<?> configClass) {
// 1.扫描配置信息中指定包下的类
this.scan(configClass);
// 2.实例化扫描到的类
this.instantiateBean();
配置 JPA 的事务管理器
这段内容介绍了 sync 包提供了基本的同步原语,例如互斥锁。除了 Once 和 WaitGroup 类型外,大多数都是为低级库例程使用而设计的。更高级别的同步最好通过通道和通信来完成。包含在此包中定义的类型的值不应被复制。
简单来说,这段内容是说 sync 包提供了一些基本的同步机制,但是除了 Once 和 WaitGroup 类型外,其他的都是为低级别的库函数设计的。更高级别的同步最好使用通道和通信。此外,这个包中定义的类型的值不应该被复制。 这段内容是关于Go语言中的条件变量(Cond)的说明。Cond是一个用于协调多个goroutine等待或通知事件发生的同步原语。每个Cond都有一个关联的Locker(通常是Mutex或RWMutex),在改变条件和调用Wait方法时必须持有该锁。Cond不能在第一次使用后被复制。在Go内存模型的术语中,Cond安排了一个Broadcast或Signal调用在解除阻塞的任何Wait调用之前“同步”。对于许多简单的用例,用户使用通道比使用Cond更好(Broadcast对应于关闭通道,Signal对应于在通道上发送)。对于更多关于替代sync.Cond的内容,可以参考Roberto Clapis的高级并发模式系列,以及Bryan Mills的并发模式讲座。