如何执行spring配置类的加载顺序?

我正在多模块项目(maven)上使用spring-boot。每个模块都有自己的@Configuration类。基本上我有以下布局

模块foo-embedded(运行仅调用SpringApplication.run())方法:

@Configuration

@EnableAutoConfiguration

@ComponentScan("de.foobar.rootpackage")

@Import({ApplicationConfig.class, RepositoryConfig.class, SecurityConfig.class})

public class FooApplication {

public static void main(String[] args) throws Exception {

SpringApplication.run(FooApplication.class, args);

}

}

模块foo-common(包含所有bean和spring-data-jpa初始化配置)

@Configuration

@EnableJpaRepositories

@EnableTransactionManagement(entityManagerFactoryRef="entityManagerFactory")

public class RepositoryConfig {

@Bean(destroyMethod = "shutdown")

public DataSource getDataSource() {

// returning a Hikari CP here

}

@Bean(name = "entityManagerFactory") // overriding spring boots default

public EntityManagerFactory getEntityManagerFactory() {

// returning a new LocalEntityManagerFactoryBean here

}

}

模块foo-security(包含spring-securiy配置和相关的域类),其对foo-common的依赖

@Configuration

@EnableWebSecurity

@EnableGlobalMethodSecurity(prePostEnabled = true)

public class SecurityConfig extends WebSecurityConfigurerAdapter {

// configuring HTTP security and defining my UserDetailsService Bean

}

当我使用FooApplication类启动应用程序时,一切都会按预期进行。上面提到的UserDetailsS​​erviceImpl与通过@EnableJpaRepositories批注创建的UserRepository自动关联。

由于我想编写一些集成测试,因此我向其中一个模块添加了一个测试clss。

模块foo-media(包含一些与域相关的内容以及该模块的测试用例)

@RunWith(SpringJUnit4ClassRunner.class)

@SpringApplicationConfiguration(classes = {RepositoryConfig.class, SecurityConfig.class})

@WebAppConfiguration

@IntegrationTest

public class DirectoryIntegrationTest {

// my test code

}

当我运行测试时,似乎在RepositoryConfig.class之前先加载了SecurityConfiguration。由于安全配置定义了必须自动连接的UserServiceImpl,因此测试无法以

NoSuchBeanDefinitionException telling me: No qualifying bean of type [com.foo.rootpackage.security.repository.UserRepository]

我已经尝试@DependsOn("UserRepository")在的bean定义中添加UserDetailsService,告诉我spring找不到该名称的bean。

任何提示或帮助将不胜感激!提前致谢!

-— (因为要求我提供更多代码)----

为了进行测试,我没有使用实际的RepositoryConfig.class,而是在公共模块中使用了TestRepositoryConfig.class。看起来像这样

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = "de.foobar.rootpackage")

public class TestRepositoryConfig extends RepositoryConfig {

@Bean

@Override

public DataSource getDataSource() {

// returning the ds for testing

}

}

回答:

所以我能够解决这个问题。正如它指出的那样,它与配置类的加载顺序无关(这是我的第一个想法)。

您可能会注意到,唯一带有@ComponentScan注释的Configuration 是FooApplication.class

Spring无法找到存储库,因为它不知道在哪里寻找。提供basePackages属性,如下所示:

@EnableJpaRepositories(basePackages = "de.foobar.rootpackage")

在TestRepositoryConfig.class上,这里就完成了技巧。

以上是 如何执行spring配置类的加载顺序? 的全部内容, 来源链接: utcz.com/qa/433417.html

回到顶部