我目前正在使用JDBC模板从数据库中获取数据。为此,我创建了一个“静态”存储库类(即标记为“ final”的类,并带有一个私有构造函数)。在其中,我试图设置两个私有静态PlatformTransactionManager
类变量的值。
但是,我的IntelliJ告诉我,类变量的值始终为null,我不知道如何解决此问题。
我希望将它们用作静态构造函数中的局部变量,因为我真正想要的是我将使用PTM准备的JdbcTemplate常量。由于我不知道该怎么做,因此我尝试将它们放入private static final
字段中。但是IntelliJ也不允许这样做。
为了解决这个问题,我研究了以下线程:
。 。 。以及关于预选赛的注释:
重要说明:
以下是我的源代码的示例:
private final class Repository {
private Repository() {}
private static final JdbcTemplate TEMPLATE1;
private static final JdbcTemplate TEMPLATE2;
@Qualifier( "transactionManager1" )
private static PlatformTransactionManager manager1;
@Qualifier( "transactionManager2" )
private static PlatformTransactionManager manager2;
static {
// NOTE: For this one, IntelliJ shows me an error stating, "Value 'manager1'
// is always 'null'."
DataSource source =
( ( JpaTransactionManager ) manager1 ).getDataSource();
TEMPLATE1 = new JdbcTemplate( source );
// NOTE: Here, there is no error ... at least, IntelliJ isn't showing any.
source = ( ( JpaTransactionManager ) manager2 ).getDataSource();
TEMPLATE2 = new JdbcTemplate( source );
}
public Map<String, Object> fetchData() {
return TEMPLATE1.queryForList( "..." ); // TODO: something
}
}
答案 0 :(得分:0)
您可以实现ApplicationContextAware
接口来获取上下文对象,并且使用此上下文对象,即使在静态上下文中也可以获取Bean。
public class ApplicationBeansProvider implments ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
}
然后在您的代码中可以执行类似的操作
private final class Repository {
private Repository() {}
private static final JdbcTemplate TEMPLATE;
private static PlatformTransactionManager manager = ApplicationBeansProvider.getBean("transactionManager");
static {
DataSource source =
( ( JpaTransactionManager ) manager ).getDataSource();
TEMPLATE = new JdbcTemplate( source );
}
public Map<String, Object> fetchData() {
return TEMPLATE1.queryForList( "..." ); // TODO: something
}
}