再读Sping源码一

ApplicationContext的创建过程在之前,我已经写过一篇关于BeanFactory的文章。但是在实际开发中,直接使用BeanFactory的场景还是比较少的,更多的时候是使用ApplicationContext。 那么下面我们就从ApplicationContext context=new ClassPathXmlApplicationContext("beanFactoryTest.xml");来探究ApplicationContext是如何启动的。 1234567891011121314151617public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[] {configLocation}, true, null);}public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException { super(parent); setConfigLocations(configLocations); if (refresh) { refresh(); }}

Spring事务基础

事务的ACID Atomicity原子性:事务是一个原子操作,由一些列动作组成,事务的原子性确保动作要么全部完成,要么都不完成。 Consistency一致性:一旦事务完成,系统必须确保它锁建模的业务处于一致的状态,而不是部分完成或部分失败。 Isolation隔离性:可能有许多事务会同时处理相同的数据,因此每个事务都应该与其它事务隔离开来,防止数据破坏。 Durability持久性:一旦事务完成,无论系统发生什么故障,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来,通常情况下,事务的结果会被持久化到存储器中。

Spring Bean的加载流程

Bean加载的总体流程以这行代码为起点,探究这背后到底经历了什么? 1MyTestBean bean=(MyTestBean)bf.getBean("MyTestBean"); 调用getBean("MyTestBean")背后实际是调用了doGetBean(name,null,null,false)doGetBean方法。这个方法干的事情有些多,但总结起来就这们几步: 通过传入的的name参数,提取beanName属性.这个地方有可能会有疑问,传入的name不就是bean的Name吗。其实不然,因为spring还允许有别名。 尝试使用直接从缓存获取,或者sinletionFactories中的ObjectFactory中获取,具体的也就是在Object sharedInstance = getSingleton(beanName);代码中。这里的缓存其实就是指DefaultSingletonBeanRegistry类中的singletonObjects:Map。这个缓存就是一个ConcurrentHashMap其中键为BeanName,值就是对应的Bean。