我正在学习Spring和Java。我创建了一个Spring 3应用程序,并尝试将连接池创建为bean:
@Bean
public ComboPooledDataSource comboPooledDataSource() {
ComboPooledDataSource pool = new ComboPooledDataSource();
// configure here
}
然后在另一个班级:
public class DatabaseQuery {
@Inject private ComboPooledDataSource comboPooledDataSource;
private Connection getConnection() {
try {
return comboPooledDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
从一些调试语句中我可以看到连接池已成功创建,但是当我使用comboPooledDataSource时,我得到一个NullPointerException。如何获取bean并使用它?我做错了吗?
答案 0 :(得分:0)
如果使用spring 3.1及更高版本 - 添加注释
@ComponentScan({"by.company.app"})
@Configuration
注释后的
之后你必须告诉spring你的DatabaseQuery必须由spring管理。所以在类声明之前添加@Component:
@Component
public class DatabaseQuery {
// code
}
在那之后,spring将管理dataSource和查询对象,并将dataSource注入查询。
答案 1 :(得分:0)
一种解决方案是显式访问Spring上下文
在AppConfig中:
@Bean
public ComboPooledDataSource comboPooledDataSource() {
然后在应用程序中
private Connection getConnection() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationContextConfiguration.class);
ComboPooledDataSource comboPooledDataSource = ctx.getBean(ComboPooledDataSource.class);
try {
return comboPooledDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
如果使用javax.inject @Named注释,也可以通过名称获取它:
ComboPooledDataSource comboPooledDataSource = ctx.getBean("myDataSource");
然后在AppConfig中:
@Bean
@Named("myDataSource")
public ComboPooledDataSource comboPooledDataSource() {