一、什么是IOC容器?
spring的IOC容器简单理解就是提供一个方便获取bean的Map对象,我们可以基于自己的定义的配置元信息,然后spring框架给我们生成一个完全可用的bean对象,并把其保存在一个指定容器中。而当程序员去需要获取该对象的时候,不要自己去进行创建。其一个高层级的示意图如下:
二、上图中各对象的概览
1、config metaData
就这个就好比我们造房子一样,通常需要施工图纸,然后建造工程师按照施工蓝图来建造房子。那么同理我们需要从IOC容器中获取到对应的对象,那么我们就需要给spring框架提供建造这个Bean对象的蓝图,而这个蓝图就是我们的配置元信息。
在spring中,配置元信息有xml方式、基于注解的方式、基于java类的方式。
1.1 xml配置方式类似下面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="top.hdsw.ioc.xml.bean.User">
<property name="name" value="萨姆·沃辛顿"/>
</bean>
</beans>
1.2 基于注解的配置方式
@Configuration
@ComponentScan(basePackages = {"top.hdsw.ioc.lookup.annotation"})
public class AppConfig {
}
1.3 基于java类的方式
@Bean
public Command command(){
return new AsyncCommand();
}
2、BeanDefinitionReader
见名知意,BeanDefinitionReader就是用来把配置的元数据转换成BeanDefinition的工具。
其中基于xml方式的配置具体实现类为:XmlBeanDefinitionReader,
基于注解方式的就是AnnotatedBeanDefinitionReader
两个类的结构图如下:
3、BeanDefinitionRegistry
BeanDefinitionRegistry是一个接口, 实现了AliasRegistry接口, 定义了一些对 BeanDefinition 的常用操作。可以认为是 Bean定义注册中心
它大概有如下功能:
以Map<String, BeanDefinition>的形式注册bean
根据beanName 删除和获取 beanDefiniation
得到持有的beanDefiniation的数目
根据beanName 判断是否包含beanDefiniation
在spring 框架中最通用的实现类为DefaultListableBeanFactory
4、BeanFactory
这个是Bean的工厂,提供各种获取到bean的方法
后续会依据这个图来分析每一个具体操作及具体类的作用!