V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
b0644170fc
V2EX  ›  Java

SpringBoot 启动过程中有什么办法可以取消掉某个类上注释的 @ImportResource 注解吗

  •  
  •   b0644170fc · 2020-08-23 21:20:00 +08:00 · 1745 次点击
    这是一个创建于 1578 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下是我的启动类,我工程是注解和 xml 混用.工程的 SpringBoot 版本是 2.3.X

    @SpringBootApplication
    @ImportResource({"classpath:spring/*.xml"})
    public class A {
    
    }
    

    我有以下的单元测试类,我只想做数据层的单元测试

    @DataJdbcTest
    @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
    @Import([SpringBootConfiguration.class, MybatisPlusAutoConfiguration.class])
    public class B {
    
    }
    

    单元测试启动后,会扫描到我的启动类 A ,因此会读入 *.xml; *.xml 中的 bean 都是我不需要的,而且实例化费时.所以我想取消掉这些.我想到如下方法:

    1. 做单元测试时,手动把 A 上的 @ImportResource 注释掉
    2. 扩展 BeanDefinitionRegistryPostProcessor

    其中第二个方法,由于自己扩展的实现类的优先级肯定低于 Spring 自己的 ConfigurationClassPostProcessor,所以实际上运行到我自己实现的方法上时, *.xml 上的 bean 已经注册到 ApplicationContext 中了,所以我就在自己的实现类中 remove 掉这些我不需要的 bean. 问题是需要 remove 掉的 bean 有点多,也没有什么规律,一个个手写不太现实.所以我觉得最好的办法就是可以在运行时去掉 A 类上的注解 @ImportResource. 各位大佬,觉得有什么办法可以做到这点. 我用的是 Junit,所以有没有可能在 Junit 阶段做些什么?

    guodong110
        1
    guodong110  
       2020-08-23 21:26:04 +08:00
    在测试目录写个,包路径和代码目录 A 一致
    ```java
    @SpringBootApplication
    //@ImportResource({"classpath:spring/*.xml"})
    public class A {

    }
    ```
    guodong110
        2
    guodong110  
       2020-08-23 21:42:19 +08:00   ❤️ 1
    补上面
    测试类用自定义的启动入口
    ```java
    @SpringBootTest(classes = A.class)
    public class xxx{

    }

    ```
    b0644170fc
        3
    b0644170fc  
    OP
       2020-08-23 21:43:45 +08:00
    @guodong110 谢谢这个方法可以.不过这会影响到其它人写的测试类
    b0644170fc
        4
    b0644170fc  
    OP
       2020-08-23 22:29:18 +08:00
    @guodong110 这样是可以.
    guodong110
        5
    guodong110  
       2020-08-23 22:56:43 +08:00   ❤️ 1
    试试这个,这样自己的测试用例只用自己的启动类,不影响别人
    ```java
    @SpringBootApplication
    @ComponentScan(basePackages = "xxx",
    excludeFilters = @ComponentScan.Filter(SpringBootApplication.class))
    //@ImportResource({"classpath:spring/*.xml"})
    public class CustomeApplication {

    }


    @SpringBootTest(classes = CustomeApplication.class)
    public class xxx{

    }

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:18 · PVG 03:18 · LAX 11:18 · JFK 14:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.