通俗易懂的讲IOC和DI
首先我们再看源码之前要清楚什么是IOC和DI,以及它的一些简单实现方法。
IOC我们可以理解为是一个共享充电桩(容器),里面存放着各种各样的充电宝,DI可以理解为给每个充电宝插上数据线(实例化)。
我们从拿到一个项目时,可以得到的信息有限,想要启动的时候讲类注入到IOC容器中,并通过DI将其实例化,可分解为以下几步。
- 读取配置文件,从配置文件拿到项目路径。
- 根据项目路径去找到打包的文件夹,扫描到其中的class文件,并将其初始化成特定的类。
- 将带有@Controller、@Service、@Repository、@Component等注解的类放进IOC容器中(可以理解为一个Map)。
- 将类中带有@Autowired等注解的属性进行依赖注入。
this.doLoadConfig("application.properties");
this.doScanner(contextConfig.getProperty("scanPackage"));
this.doInstance();
this.doAutowired();
Spring中的概念
Map :一个IOC容器 BeanFactory:顶层接口,也是创造Bean的一个工厂。 BeanDefinitionReader:解析器,用来解析所有配置文件。 BeanDefinition:原信息、配置,包括xml、yml、properties、annotation等。 Bean:Bean实例,通过反射获取的实例化Object对象,包括原生的Bean和代理的Bean。 BeanWrapper:包装器,将Bean缓存到IOC容器中,持有了Bean的引用。 ApplicationContext:上下文,持有了BeanFactory的引用,对用户开放,是一种门面模式。
通过下图可以更好的理解它们之间的关系
|