在 SpringBoot 应用程序的构造函数中访问 JdbcTemplate
access JdbcTemplate in constructor of SpringBoot application
我有一个 SpringBoot 应用程序,想访问构造函数中提供的 JdbcTemplate。我试图在 class 实例化时从数据库中缓存一些数据。我的 Groovy 代码如下所示:
@Repository
class EarthquakeRepository {
@Autowired
private final JdbcTemplate jdbcTemplate
public EarthquakeRespository() {
//fails because jdbcTemplate is null
assert jdbcTemplate
}
...
即使构造函数被触发,jdbcTemplate 仍为空。存储库中的其他方法确实可以访问 jdbcTemplate。
有人可以指出我在这里遗漏了什么吗?
谢谢!
--约翰
当您使用字段注入时,就像您在此处所做的那样,会创建一个 class 的实例,因此在注入发生之前会调用构造函数。这就是当您尝试在构造函数中使用它时 jdbcTemplate 为 null 的原因。它必须以这种方式发生,因为如果不先调用构造函数,就不会注入任何依赖项。
您可以更改存储库以使用构造函数注入:将 JdbcTemplate 声明为构造函数的参数并使用 @Autowired
注释构造函数。然后,您可以根据需要在构造函数中使用 JdbcTemplate。
您还可以将使用 @PostConstruct
注释的方法添加到您的存储库 class。此方法将在创建实例后调用(因此发生构造函数注入),如果您继续使用该方法,也会在执行字段注入后调用。然后,您将在此方法中使用 JdbcTemplate 来执行缓存。
我的建议是转向使用构造函数注入,因为它使您的 classes 更易于测试(很容易将模拟传递到构造函数中)并将您对 JdbcTemplate 的使用转移到 @PostConstruct
-注释方法,从而使构造函数尽可能轻量级。
我有一个 SpringBoot 应用程序,想访问构造函数中提供的 JdbcTemplate。我试图在 class 实例化时从数据库中缓存一些数据。我的 Groovy 代码如下所示:
@Repository
class EarthquakeRepository {
@Autowired
private final JdbcTemplate jdbcTemplate
public EarthquakeRespository() {
//fails because jdbcTemplate is null
assert jdbcTemplate
}
...
即使构造函数被触发,jdbcTemplate 仍为空。存储库中的其他方法确实可以访问 jdbcTemplate。
有人可以指出我在这里遗漏了什么吗?
谢谢!
--约翰
当您使用字段注入时,就像您在此处所做的那样,会创建一个 class 的实例,因此在注入发生之前会调用构造函数。这就是当您尝试在构造函数中使用它时 jdbcTemplate 为 null 的原因。它必须以这种方式发生,因为如果不先调用构造函数,就不会注入任何依赖项。
您可以更改存储库以使用构造函数注入:将 JdbcTemplate 声明为构造函数的参数并使用 @Autowired
注释构造函数。然后,您可以根据需要在构造函数中使用 JdbcTemplate。
您还可以将使用 @PostConstruct
注释的方法添加到您的存储库 class。此方法将在创建实例后调用(因此发生构造函数注入),如果您继续使用该方法,也会在执行字段注入后调用。然后,您将在此方法中使用 JdbcTemplate 来执行缓存。
我的建议是转向使用构造函数注入,因为它使您的 classes 更易于测试(很容易将模拟传递到构造函数中)并将您对 JdbcTemplate 的使用转移到 @PostConstruct
-注释方法,从而使构造函数尽可能轻量级。