6、springboot继承SpringBootServletInitializer获取上下文

springboot继承SpringBootServletInitializer获取上下文

springboot通过继承SpringBootServletInitializer来对tomcat容器启动,重新configure方法,

正常通过

SpringContextUtil.setApplicationContext(builder.context());获取上下文

	/** 继承SpringBootServletInitializer,重写configure,表示使用外部tomcat */
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		// 此处指向当前工程main方法执行的启动类
		// 使用外置tomcat时,需在此处添加监听,用于加载配置文件后解密
		builder.application().addListeners(new AfterConfigListener());
		// 再放入ApplicationContext
		SpringContextUtil.setApplicationContext(builder.context());
		return builder.sources(GatewayApplication.class);
	}

SpringContextUtil

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;

public class SpringContextUtil{

	/**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    	SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取bean
     */
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取bean
     */
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name和clazz返回指定的Bean
     */
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }

}

通过SpringApplicationBuilder.context()获取的上下文为空的

解决方案:通过重写onStartup方法:

/** 继承SpringBootServletInitializer,重写onStartup,获取上下文对象**/
	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		/* SpringBootServletInitializer 中  onStartup 实现代码*/
		this.logger = LogFactory.getLog(getClass());
		WebApplicationContext rootAppContext = createRootApplicationContext(
				servletContext);
		if (rootAppContext != null) {
			servletContext.addListener(new ContextLoaderListener(rootAppContext) {
				@Override
				public void contextInitialized(ServletContextEvent event) {
					// no-op because the application context is already initialized
				}
			});
		}
		else {
			this.logger.debug("No ContextLoaderListener registered, as createRootApplicationContext() did not return an application context");
		}
		/* SpringBootServletInitializer 中  onStartup 实现代码*/

		/* 获取上下文 */
		SpringContextUtil.setApplicationContext(rootAppContext);
	}
posted @ 2023-02-28 11:41  站着说话不腰疼  阅读(562)  评论(0)    收藏  举报