Map容器
BeanFactory工厂
ApplicationContext上下文:持有BeanFactory的引用(门面模式)
BeanDefinitionReader解析器:负责解析所有的配置文件
BeanDefinition 元信息,保存各种配置文件:
xml、yml、annotation、properties
Bean实例,反射实例化Object:有可能是原生的Bean,有可能是代理的Bean(将原有类复制,生成一个新类)
BeanWrapper:Spring为了统一,将原生的Bean或者代理的Bean都包装成一个BeanWrapper(包装器模式),持有了Bean的引用,缓存到IoC容器
Spring创建对象的顶层核心接口BeanFactory
而ApplicationContext是提供给用户访问的入口,实际上还是BeanFactory完成了最终的操作
如何从Servlet到Context呢?Servelt里面引用了ApplicationContext
DispatcherServlet ——> ApplicationContext 持有对方的引用
DispatcherServlet初始化ApplicationContext
DispatcherServlet调用ApplicationContext的getBean()
Spring IoC与DI主体调用流程
public class DispatcherServlet extends HttpServlet {
// 保存URL和method的对应关系
private Map<String, Method> handlerMapping = new HashMap<String, Method>();
// IoC容器访问的上下文
private MyApplicationContext applicationContext = null;
@Override
public void init(ServletConfig config) throws ServletException {
applicationContext = new MyApplicationContext(config.getInitParameter("contextConfigLocation")) {
//1、加载配置文件
beanDefinitionReader = new MyBeanDefinitionReader(configurations);
//2、解析配置文件,将配置信息封装成BeanDefinition对象
List<MyBeanDefinition> beanDefinitions = beanDefinitionReader.loadBeanDefinitions();
//3、将所有的配置信息缓存起来
registry.registerBeanDefinition(beanDefinitions);
//4、加载非延时加载的所有Bean
loadInstance() {
// 4.1循环遍历所有的beanDefinitions,拿到每一个BeanDefinition
// 4.2反射实例化对象得到instance,并将原生对象缓存起来
// 4.3将返回的Bean封装成BeanWrapper
// 4.4依赖注入,拿到BeanWrapper中依赖的Bean并set给每个field
// 4.5三级缓存:将BeanWrapper缓存起来
};
};
// 5、初始化HandlerMapping,将请求url与method对应
initHandlerMapping();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 6、根据URL委派给具体的调用方法,反射调用
try {
doDispatch(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}