From 4ab35824609dd7f0fe641c3046abf197fb380986 Mon Sep 17 00:00:00 2001 From: qjwxpz Date: Sun, 23 Feb 2020 15:57:03 +0800 Subject: [PATCH] 032-week-07 --- week_07/32/DI.txt | 14 ++++++++++++++ week_07/32/IOC.txt | 14 ++++++++++++++ week_07/32/MVC.txt | 15 +++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 week_07/32/DI.txt create mode 100644 week_07/32/IOC.txt create mode 100644 week_07/32/MVC.txt diff --git a/week_07/32/DI.txt b/week_07/32/DI.txt new file mode 100644 index 0000000..fdc828e --- /dev/null +++ b/week_07/32/DI.txt @@ -0,0 +1,14 @@ +1.寻找获取Bean 的入口:用户第一次调用getBean()方法时,IOC 容器触发依赖注入 +2.开始实例化:AbstractAutowireCapableBeanFactory类实现了ObjectFactory接口,创建容器指定的Bean实例对 + 象,同时还对创建的Bean实例对象进行初始化处理。 +3.选择Bean实例化策略:在createBeanInstance()方法中,根据指定的初始化策略,使用简单工厂、工厂方法或者容器的自动装 + 配特性生成Java实例对象。 +4.执行Bean实例化:在使用默认的无参构造方法创建Bean的实例化对象时,方法getInstantiationStrategy().instantiate() + 调用了SimpleInstantiationStrategy类中的实例化Bean的方法。 +5.准备依赖注入:调用populateBean()方法,对Bean属性的依赖注入进行处理。 +6.解析属性注入规则:当容器在对属性进行依赖注入时,如果发现属性值需要进行类型转换,如属性值是容器中另一个Bean + 实例对象的引用,则容器首先需要根据属性值解析出所引用的对象,然后才能将该引用对象注入到目标 + 实例对象的属性上去,对属性进行解析的由resolveValueIfNecessary()方法实现。 +7.注入赋值:BeanWrapperImpl类主要是对容器中完成初始化的Bean实例对象进行属性的依赖注入,即把Bean对象设置到它所依赖 + 的另一个Bean的属性中去。然而BeanWrapperImpl中的注入方法实际上由AbstractNestablePropertyAccessor来实现的。 +8. \ No newline at end of file diff --git a/week_07/32/IOC.txt b/week_07/32/IOC.txt new file mode 100644 index 0000000..0e6c281 --- /dev/null +++ b/week_07/32/IOC.txt @@ -0,0 +1,14 @@ +1.通过ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");来进入 +2.获取配置路径:ClassPathXmlApplicationContext构造函数可以看到首先调用父类super(parent)方法设置好Bean的资源加载器, + 然后再调用父类AbstractRefreshableConfigApplicationContext的setConfigLocations方法设置Bean的定位路径。 +3.开始启动:Spring IOC容器对Bean配置资源的载入是从 refresh()函数开始的,refresh()是一个模板方法,规定了IOC容器的 + 启动流程,有些逻辑要交给其子类去实现。它对Bean配置资源进行载入,ClassPathXmlApplicationContext通过调用 + 其父类AbstractApplicationContext的refresh()函数启动整个IOC容器对Bean定义的载入过程。 +4.创建容器:obtainFreshBeanFactory()方法调用子类容器的 refreshBeanFactory()方法,启动容器载入 Bean 配置信息的过程。 +5.载入配置路径:AbstractRefreshableApplicationContext 中只定义了抽象的 loadBeanDefinitions 方法, + 容器真正调用的是其子类 AbstractXmlApplicationContext 对该方法的实现。 +6.分配路径处理策略:在 AbstractBeanDefinitionReader 的抽象父类 AbstractBeanDefinitionReader 中定义了载入过程。 +7.解析配置文件路径:XmlBeanDefinitionReader通过调用ClassPathXmlApplicationContext的父类DefaultResourceLoader的 + getResource()方法获取要加载的资源。 +8.开始读取配置内容:载入Bean配置信息的最后一步是将Bean配置信息转换为Document对象,该过程由documentLoader()方法实现 + 把解析出的Bean以BeanDefinition形式存在,最后注册到IOC容器中。 \ No newline at end of file diff --git a/week_07/32/MVC.txt b/week_07/32/MVC.txt new file mode 100644 index 0000000..3beeaad --- /dev/null +++ b/week_07/32/MVC.txt @@ -0,0 +1,15 @@ +request(请求) -1-> DispatcherServlet(前端控制器)-2->HandlerMapping(处理映射器)-3->DispatcherServlet(前端控制器)-4->HandleAdapter(处理适配器)-5-> +DispatcherServlet(前端控制器)-6->Controller(后端控制器)-7->DispatcherServlet(前端控制器)-8->ViewResolver(视图解析器)-9->DispatcherServlet(前端控制器) +-10->View-11->response + +1.发送请求 +2.查找处理映射器 +3.返回处理映射器,即被映射的bean +4.查找处理适配器 +5.返回对应能正确处理请求的处理适配器保证能正确处理请求 +6.调用处理器 +7.返回封装后的modelAndView +8.通过视图解析器进行匹配 +9.返回视图结果 +10.解析视图 +11.将结果响应给用户 -- Gitee