将Spring存储库注入Spring @Configuration类

时间:2016-08-12 15:15:52

标签: java spring spring-mvc

我需要读取我的数据库以在Spring @Configuration类中加载自定义设置。

我有类似的东西:

 @Configuration
    public MyConfigClass implements ApplicationContextAware{

    @Bean(initMethod = "start", destroyMethod = "stop")
    public ServerSession serverSession() throws Exception {
          ServerSession serverSession = new ServerSession(urlGateway, useSsl, hostGateway, portGateway);
      return serverSession;
    }

我应该从DB中读取参数而不是属性文件。我知道我不能直接将我的存储库注入到这个类中,但有一个技巧或某些东西允许我这样做或者至少对db进行查询?

我正在使用Hibernate + Spring + Spring Data。

2 个答案:

答案 0 :(得分:2)

我更喜欢将必要的依赖项作为参数注入。在@Autowired类中使用@Configuration字段对我来说看起来不自然(只使用有状态字段,因为配置应该是无状态的)。只需将其作为bean方法的参数提供:

@Bean(initMethod = "start", destroyMethod = "stop")
public ServerSession serverSession(MyRepo repo) throws Exception {
    repo.loadSomeValues();
    ServerSession serverSession = new ServerSession(urlGateway, useSsl, hostGateway, portGateway);
    return serverSession;
}

这可能需要在方法级别使用@Autowired本身,具体取决于Spring版本:

@Bean(initMethod = "start", destroyMethod = "stop")
@Autowired
public ServerSession serverSession(MyRepo repo) throws Exception {
    repo.loadSomeValues();
    ServerSession serverSession = new ServerSession(urlGateway, useSsl, hostGateway, portGateway);
    return serverSession;
}

另见:

答案 1 :(得分:0)

@Configuration类中的自动装配和DI工作。如果您遇到困难,可能是因为您在应用启动生命周期中过早地尝试使用注入的实例。

@Configuration
public MyConfigClass implements ApplicationContextAware{
    @Autowired
    private MyRepository repo;

    @Bean(initMethod = "start", destroyMethod = "stop")
    public ServerSession serverSession() throws Exception {
        // You should be able to use the repo here
        ConfigEntity cfg = repo.findByXXX();

        ServerSession serverSession = new ServerSession(cfg.getUrlGateway(), cfg.getUseSsl(), cfg.getHostGateway(), cfg.getPortGateway());
        return serverSession;
    }
}

public interface MyRepository extends CrudRepository<ConfigEntity, Long> {
}