Spring 通篇源码 之 扩展点 之 ApplicationContextInitializer原理与应用

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

Spring 通篇源码 基于 spring-framework-4.1.7.RELEASE 版本。

  简述

  ApplicationContextInitializer是Spring初始化WebApplicationContext(ConfigurableApplicationContext及其子类)的回调接口,在WebApplicationContext(ConfigurableApplicationContext及其子类)的refresh()方法调用之前被调用。

  通常用于对WebApplicationContext进行一些编程式初始化的Web应用程序中。例如:针对WebApplicationContext(ConfigurableApplicationContext)的environment,注册属性源或激活配置文件。参考ContextLoader和FrameworkServlet中支持定义contextInitializerClasses作为context-param或定义init-param。

  自定义的ApplicationContextInitializer,除了实现ApplicationContextInitializer接口外。若实现了org.springframework.core.Ordered或被org.springframework.core.annotation.Order标记,在运行时会得到适当的排序,Order越小,执行优先级越高。

  源码

  ApplicationContextInitializer的实现很简单,只有一个initialize方法,其参数是ConfigurableApplicationContext或其子类的实例,表示Spring应用上下文,可以对其包含的信息进行处理。

package org.springframework.context;

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
    
    

	void initialize(C applicationContext);

}

  自定义

  首先需要定义一个类,实现ApplicationContextInitializer接口,代码如下:

package com.arhorchin.securitit.protocol.extend;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @author Securitit.
 * @note 自定义ApplicationContextInitializer.
 */
public class CustomerApplicationContextInitializer implements ApplicationContextInitializer {
    
    
    
    /**
     * logger.
     */
    private Logger logger = Logger.getLogger(CustomerApplicationContextInitializer.class);

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
    
    
        logger.info("WebApplicationContext-id:" + applicationContext.getId());
        applicationContext.getEnvironment().getSystemProperties().put("defineKey", "defineValue");
    }

}

  例子中只是简单的获取了WebApplicationContext(ConfigurableApplicationContext)的id属性,同时设置WebApplicationContext(ConfigurableApplicationContext)的系统属性defineKey。

​  编写完CustomerApplicationContextInitializer以后,需要在web.xml中进行配置,如下:

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>
        com.arhorchin.securitit.protocol.extend.CustomerApplicationContextInitializer
    </param-value>
</context-param>

  在启动Web应用时,就会在控制台打印如下日志,说明ApplicationContextInitializer扩展成功。

2020-08-19 23:01:51,624 INFO  com.arhorchin.securitit.protocol.extend.CustomerApplicationContextInitializer.info:46 - WebApplicationContext-id:org.springframework.web.context.WebApplicationContext:/xxxx

  排序

​  · 实现org.springframework.core.Ordered接口

package com.arhorchin.securitit.protocol.extend;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.Ordered;

/**
 * @author Securitit.
 * @note 自定义ApplicationContextInitializer.
 */
public class CustomerApplicationContextInitializer implements ApplicationContextInitializer, Ordered {
    
    
    
    /**
     * logger.
     */
    private Logger logger = Logger.getLogger(CustomerApplicationContextInitializer.class);

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
    
    
        logger.info("WebApplicationContext-id:" + applicationContext.getId());
        applicationContext.getEnvironment().getSystemProperties().put("defineKey", "defineValue");
    }

    @Override
    public int getOrder() {
    
    
        return 1;
    }

}

  · 类上标记org.springframework.core.annotation.Order注解。

package com.arhorchin.securitit.protocol.extend;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;

/**
 * @author Securitit.
 * @note 自定义ApplicationContextInitializer.
 */
@Order(1)
public class CustomerApplicationContextInitializer implements ApplicationContextInitializer {
    
    
    
    /**
     * logger.
     */
    private Logger logger = Logger.getLogger(CustomerApplicationContextInitializer.class);

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
    
    
        logger.info("WebApplicationContext-id:" + applicationContext.getId());
        applicationContext.getEnvironment().getSystemProperties().put("defineKey", "defineValue");
    }

}

  总结

  ApplicationContextInitializer扩展点的实现相对比较简单,只要按照上面的步骤进行,就可以轻松的完成ApplicationContextInitializer的扩展,至于扩展点里面的逻辑实现,完全取决于业务逻辑的复杂度。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108113189