zoukankan      html  css  js  c++  java
  • SpringBoot加载应用上下文初始器

    SpringBoot加载应用上下文初始器

    利用 Spring 工厂加载机制,实例化 ApplicationContextInitializer 实现类,并排序对象集合。

    关键方法

    private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,
    			Class<?>[] parameterTypes, Object... args) {
    		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    		// Use names and ensure unique to protect against duplicates
    		Set<String> names = new LinkedHashSet<>(
    				SpringFactoriesLoader.loadFactoryNames(type, classLoader));
    		List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
    				classLoader, args, names);
    		AnnotationAwareOrderComparator.sort(instances);
    		return instances;
    }
    

    技术实现步骤

    • 实现类: org.springframework.core.io.support.SpringFactoriesLoader
    • 配置资源: META-INF/spring.factories
    • 排序: AnnotationAwareOrderComparator#sort

    自定义初始化器

    • 编写类实现ApplicationContextInitializer接口
      • 有两种指定顺序的方法,第一种:类上加注解@Order(Ordered.HIGHEST_PRECEDENCE),第二种则是实现Ordered接口
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class HelloWorldApplicationContextInitializer<C extends ConfigurableApplicationContext>
            implements ApplicationContextInitializer<C> {
        @Override
        public void initialize(C applicationContext) {
            System.out.println("ConfigurableApplicationContext.id = "+ applicationContext.getId());
        }
    }
    
    public class AfterHelloWorldApplicationContextInitializer implements ApplicationContextInitializer, Ordered {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            System.out.println("After application.id = " + applicationContext.getId());
        }
        @Override
        public int getOrder() {
            return Ordered.LOWEST_PRECEDENCE;
        }
    }
    
    • 在spring.properties中配置
    # ApplicationContextInitializer
    org.springframework.context.ApplicationContextInitializer=
    com.imooc.diveinspringboot.context.AfterHelloWorldApplicationContextInitializer,
    com.imooc.diveinspringboot.context.HelloWorldApplicationContextInitializer
    
  • 相关阅读:
    python字符串格式化 %操作符 {}操作符---总结
    Python中TKinter模块中的Label组件
    Python中urlopen()介绍
    Python中else语句块(和if、while、for、try搭配使用)
    Python文件操作汇总
    python socket 编程之三:长连接、短连接以及心跳
    python 源代码分析之调试设置
    python 调用shell或windows命令
    python socket 编程之二:tcp三次握手
    python socket 编程之一:编写socket的基本步骤
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13035852.html
Copyright © 2011-2022 走看看