0

我正在学习 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 并使用它?我做错了吗?

4

2 回答 2

0

如果您使用 spring 3.1 及更高版本 - 添加注释

@ComponentScan({"by.company.app"})

@Configuration注释后

之后你必须告诉 spring 你的 DatabaseQuery 必须由 spring 管理。所以在类声明之前添加@Component:

@Component
public class DatabaseQuery {
    // code
}

之后,spring 将同时管理数据源和查询对象,并注入数据源进行查询。

于 2013-08-20T23:08:13.430 回答
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() {
于 2013-08-21T15:07:38.450 回答