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
    
  • 相关阅读:
    响应式css样式
    组件 computed 与 vuex 中 getters 的使用,及 mapGetters 的使用,对象上追加属性,合并对象
    nginx 错误集锦
    动态的添加路由
    NProgress的使用 及 路由 token 定向的使用
    token的解码及 判断值不为空的方法
    nginx 的使用
    IT公司100题-tencent-打印所有高度为2的路径
    测试
    Objective-C 与 C++ 的异同
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13035852.html
Copyright © 2011-2022 走看看