美文网首页
Spring Core

Spring Core

作者: 金刀止戈 | 来源:发表于2019-07-19 18:23 被阅读0次

    Spring 3.0之后集成Spring框架
    web.xml

    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    

    ContextLoaderListener实现ServletContextListener接口,在contextInitialized方法中完成Spring的加载

    public void contextInitialized(ServletContextEvent event) {
        initWebApplicationContext(event.getServletContext());
    }
    

    其中主要逻辑都在子类contextInitialized中initWebApplicationContext方法中实现:

    • 创建WebApplicationContext:createWebApplicationContext(servletContext);
       <!-- 通过servletContext.getInitParameter("contextConfigLocation")获取-->
       <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/applicationContext.xml</param-value>
       </context-param>
       <!-- 通过servletConfig.getInitParameter("contextConfigLocation")获取-->
       <servlet>
         <servlet-name>TestServlet</servlet-name>    
         <servlet-class>com.xxx.xxx.TestServlet</servlet-class>    
         <init-param>    
           <param-name>initParam</param-name>    
           <param-value>avalible in servlet init()</param-value>    
         </init-param>
       </servlet>
      
      1. 优先通过servletContext.getInitParameter取web.xml里key为 contextClass配置的类(必须为ConfigurableWebApplicationContext的子类)实例化
      2. 其次使用(ContextLoader.properties中配置)默认类
        org.springframework.web.context.support.XmlWebApplicationContext
    • 配置刷新applictionContext的值configureAndRefreshWebApplicationContext
      1. StandardEnvironment.initPropertySources
      2. customizeContext(sc, wac)
        初始化配置在web.xml中的参数globalInitializerClasses、contextInitializerClasses中,并且类型为ApplicationContextInitializer的类,执行initialize方法🚩
      3. wac.fresh() spring加载核心

    fresh方法

    1. prepareRefresh
    • StandardEnvironment.initPropertySources
    • StandardEnvironment.validateRequiredProperties 未找到数据入口?
    2. obtainFreshBeanFactory 建立BeanFactory,只有bean定义
    • 销毁已经存在的beanFactory
    • createBeanFactory parent存在就继承parent配置,BeanNameAware、BeanFactoryAware、BeanClassLoaderAware加入到依赖检查忽略列表ignoredDependencyInterfaces,主要功能是忽略给定接口的自动装配功能,因为类的初始化需要前置检查依赖注入是否都注入成功🙈
    • customizeBeanFactory 自定义是否运行bean定义覆盖和单例bean的循环引用
    • loadBeanDefinitions 加载bean定义,根据具体实现类分为不同的方式,不如xml配置、注解等(后续详细解析)
    3. prepareBeanFactory BeanFactory创建的前期准备
    • 1 ApplicationContextAwareProcessor BeanPostProcessor处理ApplicationContext相关的aware接口注入
    • 2 ApplicationContext相关aware接口加入到依赖检查忽略列表ignoredDependencyInterfaces
    • 3 BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext等自动注入类型候选集
    /** Map from dependency type to corresponding autowired value */
    private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);
    
    • 4 ApplicationListenerDetector BeanPostProcessor处理ApllicationListener注册
    /** Helper class used in event publishing */
    private ApplicationEventMulticaster applicationEventMulticaster;
    /** Statically specified listeners */
    private final Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<>();
    
    • 5 LoadTimeWeaverAwareProcessor BeanPostProcessor处理LoadTimeWeaverAware注入
      LoadTimeWeaver 待延伸,静态动态织入
    <!-- 注解方式 -->
    @Configuration
    @EnableLoadTimeWeaving
    public class AppConfig {}
    
    <!-- xml配置方式-->
    <beans>
        <context:load-time-weaver/>
    </beans>
    
    • 6 加载默认environment beans
      environment、systemProperties(System#getProperties)、systemEnvironment(System#getenv)
    4. postProcessBeanFactory
    • 1 ServletContextAwareProcessor BeanPostFactory处理ServletContextAware、ServletConfigAware注入
    • 2 ServletContextAware、ServletConfigAware接口加入到依赖检查忽略列表ignoredDependencyInterfaces
    • 3 注册request(RequestScope)、session(SessionScope)、application(ServletContextScope)等scope
    • 4 ServletRequest、ServletResponse、HttpSession、WebRequest等自动注入类型候选集
    • 5 注册单例bean:servletContext、servletConfig、contextParameters、contextAttributes
    5. invokeBeanFactoryPostProcessors
    • 执行所有的 BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry🚩按PriorityOrdered->Ordered->其他
    • 执行所有的 BeanFactoryPostProcessor#postProcessBeanFactory🚩按PriorityOrdered->Ordered->其他
    • 清除mergedBeanDefinitions中未包含在alreadyCreated中的
    • 清除allBeanNamesByType,singletonBeanNamesByType数据,用于按类型注入
    • 执行3.5
    6. registerBeanPostProcessors
    • 注册并实例化BeanPostProcessor🚩按PriorityOrdered->Ordered->其他 (getBean 后续详细阐述🙈)
    • 注册MergedBeanDefinitionPostProcessor
    • 执行3.4
    7. initMessageSource 初始化MessageSource,用于国际化,beanName:messageSource
    8. initApplicationEventMulticaster 初始化event multicaster
    9. onRefresh🚩模板方法,提供自定义加载扩展点
    10. registerListeners
    • 将所有接口ApplicationListener注册到applicationEventMulticaster,并发布earlyApplicationEvents
    11. finishBeanFactoryInitialization
    • 设置beanFactory的conversionService
    • 如果没有embeddedValueResolvers,默认使用getEnvironment()#resolvePlaceholders
    • 初始化所有LoadTimeWeaverAware类(getBean)
    • freezeConfiguration 冻结配置,getBeanNamesForType完全通过缓存读取
    • preInstantiateSingletons 实例化所有的非lazyInit的单例bean(getBean)
      1. SmartFactoryBean执行isEagerInit🚩
      2. SmartInitializingSingleton执行afterSingletonsInstantiated
    12.finishRefresh
    • clearResourceCaches 清楚resource缓存
    • 初始化LifecycleProcessor,默认DefaultLifecycleProcessor,并执行onRefresh
    • 发布ContextRefreshedEvent
    • LiveBeansView.registerApplicationContext JMX相关

    相关文章

      网友评论

          本文标题:Spring Core

          本文链接:https://www.haomeiwen.com/subject/fljslctx.html