在SpringBoot应用程序的构造函数中访问JdbcTemplate

时间:2015-01-24 18:19:06

标签: spring-boot

我有一个SpringBoot应用程序,并希望在构造函数中访问提供的JdbcTemplate。我试图在类实例化时从数据库缓存一些数据。我的Groovy代码如下所示:

@Repository
class EarthquakeRepository {

@Autowired
private final JdbcTemplate jdbcTemplate

public EarthquakeRespository() {
    //fails because jdbcTemplate is null
    assert jdbcTemplate
}
...

即使构造函数被触发,jdbcTemplate也为null。存储库中的其他方法可以访问jdbcTemplate。

有人可以指出我在这里缺少什么吗?

谢谢!

- 约翰

1 个答案:

答案 0 :(得分:2)

当您使用字段注入时,就像在此处一样,创建类的实例,因此在注入发生之前调用构造函数。这就是当你尝试在构造函数中使用它时jdbcTemplate为null的原因。它必须以这种方式发生,因为在没有首先调用构造函数的情况下,没有任何依赖项被注入。

您可以更改您的repostory以使用构造函数注入:将JdbcTemplate声明为构造函数的参数,并使用@Autowired注释构造函数。然后,如果需要,可以在构造函数中使用JdbcTemplate。

您还可以将使用@PostConstruct注释的方法添加到存储库类。在创建实例之后将调用此方法(因此发生构造函数注入),并且如果继续执行该方法,也会在执行字段注入之后调用此方法。然后,您可以在此方法中使用JdbcTemplate来执行缓存。

我的建议是转向使用构造函数注入,因为它使您的类更容易测试(很容易将模型传递给构造函数)并将JdbcTemplate的使用转移到@PostConstruct - 带注释的方法,从而使构造函数尽可能轻量化。