手写Spring IoC与DI

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();
        }
    }
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值