我正在学习Spring,而且我在尝试建立一个相对基本的Spring项目时遇到了一些问题。我正在创建一个简单地从数据库中读取的应用程序,但是我遇到了自动装配或者缺少自动装配的问题。我的GetCustomerEvent
类在GetCustomers()
方法中抛出空指针异常,因为CustomerService
变量尚未初始化。有人能指出我在正确的方向吗?
Application.class
package org.ben.test.main;
@Configuration
@ComponentScan(basePackages={"org.ben.test.persistence", "org.ben.test.main"})
public class Application {
@Bean
public CustomerService customerService() {
return new CustomerService();
}
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource();
dmds.setDriverClassName("org.postgresql.Driver");
dmds.setUrl("jdbc:postgresql://localhost:5432/Customers");
dmds.setUsername("postgres");
dmds.setPassword("postgres");
return dmds;
}
@Bean
public JdbcTemplate jdbcTemplate() {
DataSource ds = getDataSource();
JdbcTemplate jdbc = new JdbcTemplate(ds);
return jdbc;
}
public static void main(String[] args) {
GetCustomerEvent ev = new GetCustomerEvent();
ev.GetCustomers();
}
}
CustomerService.class
package org.ben.test.persistence;
@Component
public class CustomerService {
@Autowired JdbcTemplate jdbcTemplate;
public CustomerService() {
}
public void getCustomers() {
jdbcTemplate.query("SELECT * FROM Customers", new RowMapper() {
@Override
public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
System.out.println(arg0.getString("firstName"));
return null;
}
});
}
}
GetCustomerEvent.class
package org.ben.test.persistence;
@Component
public class GetCustomerEvent {
@Autowired
CustomerService customerService;
public GetCustomerEvent() {
}
public void GetCustomers() {
customerService.getCustomers();
}
}
答案 0 :(得分:2)
问题在于以下行
GetCustomerEvent ev = new GetCustomerEvent();
您使用" new"手动创建了实例。 Spring对这个对象没有任何想法。有关详细信息,请参阅Why is my Spring @Autowired field null?。
答案 1 :(得分:2)
您没有初始化Spring容器。
您需要create your context才能使其正常工作。
答案 2 :(得分:0)
无论您使用的是基于xml还是基于注释的配置,都需要创建应用程序上下文。 如果您的应用程序是Web应用程序,请参阅此文章Loading context in Spring using web.xml以加载应用程序上下文
获得应用程序后,您可以使用context.getBean()
方法获取bean
此外,spring容器不管理您使用new运算符创建的对象。在您的示例中,您需要自动装配GetCustomerEvent bean
@Autowired GetCustomerEvent getCustomerEvent;
//and call
getCustomerEvent.getCustomers();