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
    
  • 相关阅读:
    【年度回顾】2020,云开发的20个重大更新
    SQL 排序检索数据
    【JVM进阶之路】三:探究虚拟机对象
    【JVM进阶之路】二:Java内存区域
    【JVM进阶之路】一:Java虚拟机概览
    这些不可不知的JVM知识,我都用思维导图整理好了
    计算机网络的七层结构、五层结构和四层结构
    synchronized详解
    Linux内核中I2C总线及设备长啥样?
    C语言中这些预定义宏的不可不会
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13035852.html
Copyright © 2011-2022 走看看