美文网首页工作生活
控制配置类的加载顺序@AutoConfigureAfter

控制配置类的加载顺序@AutoConfigureAfter

作者: 我离大佬只差这么一点 | 来源:发表于2019-07-04 08:47 被阅读0次

当您的项目处在以下情况的时候,我觉得这篇文章对您有一些帮助

  1. 使用Springboot 1.5.4 及以上 (本人没有用过更低版本)
  2. 自动装配不能满足您的需求,需要自己简单的控制配置类加载顺序

@AutoConfigureAfter 是 spring-boot-autoconfigure包下的注解
其作用顾名思义,就是将一个配置类在另一个配置类之后加载。

研究初衷:
本人公司使用了Pagehelper,它的实现原理是Mybatis Plugin,也就是拦截器。根据拦截器的加载机制,后加载的先执行(在另一篇文章中会详细介绍Mybatis拦截器,这里讲的并不全面),由于某种原因,我需要在他之前拦截到SQL语句,这就要求拦截器要加载在Pagehelper之后。

只需要两步

  1. 第一步,创建配置类,使用@AutoConfigureAfter注解,注解内写明在哪一个配置类之后执行。
@Configuration
@AutoConfigureAfter({PageHelperAutoConfiguration.class})
public class DataPermissionConfig {
}
  1. 第二步,在项目的 resources 目录下,创建 META-INF 目录(如果已有,不用创建),在 META-INF 目录下创建 spring.factories 文件,文件中写入以下内容。
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration,\
com.xxx.xxx.xxx.xxx.config.DataPermissionConfig

等号后面是配置类的路径,用逗号 "," 隔开。

除了@AutoConfigureAfter,spring-boot-autoconfigure下还有很多类似注解,如:@AutoConfigureBefore、@AutoConfigureOrder等。有兴趣的可以多加研究,其实现原理基本都是在 getInPriorityOrder() 方法中通过 ASCII、Sort值、before/after 来排序的。源码如下:

public List<String> getInPriorityOrder(Collection<String> classNames) {
        final AutoConfigurationSorter.AutoConfigurationClasses classes = new AutoConfigurationSorter.AutoConfigurationClasses(this.metadataReaderFactory, this.autoConfigurationMetadata, classNames);
        List<String> orderedClassNames = new ArrayList(classNames);
        // 首先根据ASCII来进行排序
        Collections.sort(orderedClassNames);
        // 根据 Order
        Collections.sort(orderedClassNames, new Comparator<String>() {
            public int compare(String o1, String o2) {
                int i1 = classes.get(o1).getOrder();
                int i2 = classes.get(o2).getOrder();
                return i1 < i2 ? -1 : (i1 > i2 ? 1 : 0);
            }
        });
        // 根据 @AutoConfigureAfter @AutoConfigureBefore
        List<String> orderedClassNames = this.sortByAnnotation(classes, orderedClassNames);
        return orderedClassNames;
    }

以上均为个人理解,如有不足之处,欢迎在评论区留言。

相关文章

  • 控制配置类的加载顺序@AutoConfigureAfter

    当您的项目处在以下情况的时候,我觉得这篇文章对您有一些帮助 使用Springboot 1.5.4 及以上 (本人没...

  • springboot order注解

    Spring 4.2 利用@Order控制配置类的加载顺序 演示 两个演示bean 两个配置类,注意@Order配...

  • Spring自动配置类顺序控制问题

    日常开发场景,需要对几个@Configuration标注的配置类控制下加载顺序,理所当然的用到了@AutoConf...

  • JVM类加载入门

    一 类加载顺序 class类加载-->验证-->准备--->解析--->初始化 class类加载:通过类加载器加载...

  • 2018-09-23

    1. 配置文件加载顺序 OS X 系统的配置文件,加载顺序为: /etc/profile和/etc/paths是...

  • [Mac] OS X修改环境变量

    1. 配置文件加载顺序 OS X系统的配置文件,加载顺序为: /etc/profile和/etc/paths是系统...

  • 类的加载过程

    类的加载过程 类文件加载的顺序 1、先加载执行父类的静态变量及静态初始化块(执行先后顺序按排列的先后顺序)2、再加...

  • OS x修改环境变量

    1. 配置文件加载顺序 OS X系统的配置文件,加载顺序为: /etc/profile和etc/paths是系统级...

  • Struts2简介

    Struts2的配置文件和加载顺序 struts.xml配置文件的内容标签 动作类:Action Struts2中...

  • 如果你还不知道如何控制springboot中bean的加载顺序,

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上...

网友评论

    本文标题:控制配置类的加载顺序@AutoConfigureAfter

    本文链接:https://www.haomeiwen.com/subject/plwkhctx.html