一、前言
针对于spring源码的初步学习,首先应该掌握四大块,基于四大块全部掌握的基础上在进行扩展深入研究学习,具体四块如下:
1.Ioc容器加载的过程
2.spring解决循环依赖方式
3.spring Aop的实现
4.spring 事务管理实现
如果掌握了上面的四点,那么基本上就可以很自豪的说精通spring了,也算掌握了spring大概一半的内容了。
本文主要研究Ioc容器的加载过程。
二、什么是Ioc容器?
我们常说Ioc是一个容器,是的,ioc就是一个容器,并且它并不神秘,说白了,spring就是用一个ConcurrentHashMap来作为Ioc容器的,key就是beanName,value就是Bean的实例对象,所以Ioc容器就是这么简单易懂。
虽然我们都知道它就是一个简单的Map,但是spring如何创建这个Map,且往这个Map里面存值? 下面一起学习。
所谓的Ioc容器的加载过程,我能否换句话说,就是向一个Map中存值的过程?
这个过程也很简单,简单到就四步:
1.找到要存的数据
2.处理要存的数据
3.创建要存的数据的值
4.把值存到容器map中
转化为spring的逻辑描述:
1.基于注解或者xml配扫描配置的类
2.注册为BeanDefinition到BeanDefinitionMap中
3.BeanFactory基于BeanDefinition创建Bean
4.把Bean存入Ioc容器
这就是Ioc的加载过程,但是.....光知道这些可还不够,我们还需是需要了解一下具体加载的细节,方便我们在开发spring应用时,能灵活使用并且能够基于Spring做一些扩展,毕竟spring提供的那么多扩展点,可以不是闹着玩的。
三、Ioc的加载过程
上面已经大致了解了Ioc加载的四大步,现在对这四步一一展开分析:
首先假设我们有一个配置类:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@EnableAspectJAutoProxy //底层是@Import注解
@ComponentScan(basePackages = {"com.zb.study"})
public class Config {
}
然后有一个Service
@Service
public class CarServiceImpl implements CarService {
public CarServiceImpl() {
System.out.println("这是CarServiceImpl的构造方法");
}
}
然后我们通过spring的ApplicationContext获取CarServiceImpl的实例对象
import com.zb.study.service.CarService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestMain {
public static void main(String[] args) {
//把主配置类传进去
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(Config.class);
String[] beanDefin