我是一个Spring新手,我正在关注春季网站上的书籍和教程的一些例子,我无法让我的代码工作。
我正在尝试使用JdbcTemplate访问DataBase。这就是我的root-context.xml的样子:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/db" />
<property name="username" value="userr" />
<property name="password" value="password" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
<bean id="myDao" class="com.me.myproj.persistence.JdbcMyaDao">
<property name="dataSource" ref="dataSource"/>
</bean>
这是我的JdbcMyDao(所有导入都没问题,我不会粘贴它们):
public class JdbcMyDao implements MyDao{
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public String getOpcionById(){
String SQL_Q="select name from options where id=35";
return (String)this.jdbcTemplate.queryForObject(SQL_Q, String.class);
}
}
最后,我的控制器:
@Controller
public class myController {
@RequestMapping(value = "/show", method = RequestMethod.GET)
public String show(Model model){
JdbcMyDao daoP=new JdbcMyDao();
String op=daoP.getOpcionById();
model.addAttribute("op",op);
return "show";
}
}
好的,然后,show.jsp只打印返回字符串。
所以,这是一个非常简单的DataBase访问,但是在使用JdbcTemplate时(在函数getOpcionById中)我得到一个nullPointerException
我认为这是因为函数 setDataSource 从未运行过,我认为Spring是由IoC运行的,我试图把@Autowired放到jdbcTemplate属性我JdbcMyDao,但它也没有用。有人能告诉我Spring的步骤以及我应该采取哪些步骤?或者我应该做出哪些改变以及为什么?
答案 0 :(得分:3)
您需要在控制器中自动装配DAO,而不是实例化它:
@Autowired
private JdbcMyDao dao;
使用new JdbcMyDao()
实例化它时,它不受spring管理,并且不会注入其依赖项。
在我看来,这是依赖注入初学者最常见的错误。检查this post,看看它是否能让你更清楚。
答案 1 :(得分:2)
您的控制器正在实例化自己的JdbcMyDao
并调用它,而不是使用您在root-context.xml
中声明的bean。您需要将myDao
bean注入控制器并调用它。
另外,你有没有理由定义一个JdbcTemplate
bean,然后再对它做任何事情? DAO的setDataSource
方法实例化了自己的JdbcTemplate
(很好),所以没有理由声明bean。
我感觉你还没有完全理解依赖注入的概念 - 你似乎使用了直接实例化和声明的bean,而不仅仅是后者。