首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何执行spring配置类的加载顺序?

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

Stack Overflow用户
提问于 2014-06-18 13:35:31
回答 2查看 50.6K关注 0票数 22

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

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

代码语言:javascript
复制
@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-公共(包含所有bean和spring jpa初始化配置)

代码语言:javascript
复制
@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-安全性(包含spring安全配置和相关域类),它对foo公共具有maven依赖关系。

代码语言:javascript
复制
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // configuring HTTP security and defining my UserDetailsService Bean
}

当我使用FooApplication类启动应用程序时,一切都如愿以偿。上面提到的UserDetailsServiceImpl get使用我的UserRepository自动处理,它是通过@EnableJpaRepositories注释创建的。

由于我想编写一些集成测试,所以我在我的一个模块中添加了一个测试clss。

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

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RepositoryConfig.class, SecurityConfig.class})
@WebAppConfiguration
@IntegrationTest
public class DirectoryIntegrationTest {
    // my test code
}

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

代码语言:javascript
复制
NoSuchBeanDefinitionException telling me: No qualifying bean of type [com.foo.rootpackage.security.repository.UserRepository]

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

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

--编辑(因为我被要求提供更多的代码)

为了进行测试,我不使用实际的RepositoryConfig.class,而是在公共模块中有一个TestRepositoryConfig.class。看上去像这样

代码语言:javascript
复制
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = "de.foobar.rootpackage")
public class TestRepositoryConfig extends RepositoryConfig {

    @Bean
    @Override
    public DataSource getDataSource() {
        // returning the ds for testing
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-19 08:55:39

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

正如您可能注意到的,唯一具有@ComponentScan注释的配置是FooApplication.class Spring无法找到存储库,因为它不知道在哪里查找。提供这样的basePackages属性:

代码语言:javascript
复制
@EnableJpaRepositories(basePackages = "de.foobar.rootpackage")

在TestRepositoryConfig.class这里做了个小把戏。

票数 6
EN

Stack Overflow用户

发布于 2014-06-18 22:30:29

您可以在配置类上使用@Order注释来定义负载排序。但是这很奇怪,因为Spring应该解决正确的顺序--所以请检查是否在UserDetailsService中插入了属性inject UserDetailsService

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24287024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档