如何将@Inject一个Bean转换为Java类?

时间:2013-08-20 22:40:57

标签: java spring javabeans

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

2 个答案:

答案 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() {