我有一个SpringBoot应用程序,并希望在构造函数中访问提供的JdbcTemplate。我试图在类实例化时从数据库缓存一些数据。我的Groovy代码如下所示:
@Repository
class EarthquakeRepository {
@Autowired
private final JdbcTemplate jdbcTemplate
public EarthquakeRespository() {
//fails because jdbcTemplate is null
assert jdbcTemplate
}
...
即使构造函数被触发,jdbcTemplate也为null。存储库中的其他方法可以访问jdbcTemplate。
有人可以指出我在这里缺少什么吗?
谢谢!
- 约翰
答案 0 :(得分:2)
当您使用字段注入时,就像在此处一样,创建类的实例,因此在注入发生之前调用构造函数。这就是当你尝试在构造函数中使用它时jdbcTemplate为null的原因。它必须以这种方式发生,因为在没有首先调用构造函数的情况下,没有任何依赖项被注入。
您可以更改您的repostory以使用构造函数注入:将JdbcTemplate声明为构造函数的参数,并使用@Autowired
注释构造函数。然后,如果需要,可以在构造函数中使用JdbcTemplate。
您还可以将使用@PostConstruct
注释的方法添加到存储库类。在创建实例之后将调用此方法(因此发生构造函数注入),并且如果继续执行该方法,也会在执行字段注入之后调用此方法。然后,您可以在此方法中使用JdbcTemplate来执行缓存。
我的建议是转向使用构造函数注入,因为它使您的类更容易测试(很容易将模型传递给构造函数)并将JdbcTemplate的使用转移到@PostConstruct
- 带注释的方法,从而使构造函数尽可能轻量化。