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
    
  • 相关阅读:
    3ds
    markdown-to-html.min.js
    $interpolateProvider
    Angular 插值字符串
    Angular 手动解析表达式
    JAVA 多线程
    listFiles()
    键盘读入
    BufferedInputStream、BufferedOutputStream
    FileInputStream、FileOutputStream的应用
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13035852.html
Copyright © 2011-2022 走看看