問題設計的關鍵類及方法:
如下 @Repository(value = "bardao")//value的作用在於給該Bean(BarDao)命名 public class BarDao { public static final Log LOGGER = LogFactory.getLog(Application.class); @Autowired private JdbcTemplate jdbcTemplate; //如下方法是首先先數據庫里面插入一條記錄 public Bar add(Bar bar) { String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
LOGGER.info("bar.gerId() is " + bar.getId());
//jdbcTemplate = new JdbcTemplate();//這樣做的目的是問了解決jdbcTemplate無法注入而使得jdbcTemplate=null臨時采用的一種辦法,詳見問題1
System.out.println("jdbcTemplate:"+jdbcTemplate);//通過應用程序上下文的方式,在獲取bardao這個bean的時候則可以實現自動注入,通過@Autowire這個注解使得jdbcTemplate自動注入
Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }
問題1:使用@Autowired標注時,jdbcTemlate==null;
原因:經過自己的測試之后發現,不在注解@Autowired本身,而在於包含該JdbcTemlate的Bean(BarDao)生成實例的方式。
1.如果采用new 方式來生成實例,則會出現null的情況。new方式:BarDao bd = new BarDao();、
public void test(){
Bar bar = new Bar(1, 34, "天堂島");
BarDao bd = new BarDao();
bd.add(bar);
}
對應add方法
public Bar add(Bar bar) {
String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
LOGGER.info("bar.gerId() is " + bar.getId());
jdbcTemplate = new JdbcTemplate();//不這樣做jdbcTemplate==null
System.out.println("jdbcTemplate:"+jdbcTemplate);//通過應用程序上下文的方式獲取bardao這個bean的時候則可以實現自動注入
Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }
解決:如果采用應用程序上下文獲取bean的方式,則不會出現null的情況。通過應用程序上下文獲取bean的方式:
public void test(){
Bar bar = new Bar(1, 34, "天堂島");
BarDao bd = (BarDao) SpringContextUtil.getBean("bardao");
bd.add(bar);
}
注:點擊查看SpringContextUtil工具類代碼
對應add方法
public Bar add(Bar bar) {
String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
LOGGER.info("bar.gerId() is " + bar.getId());
System.out.println("jdbcTemplate:"+jdbcTemplate);//jdbcTemplate實現了自動注入,所以jdbcTemplate != null
Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }
問題2:出現 java.lang.IllegalArgumentException: No DataSource specified
原因:是基於上一個問題而出現的。大概是這樣,使用了new方式來生成實例,導致jdbcTemplate無法注入使得JdbcTemplate=null。這時我便急中生智,既然等於空,那我就同樣new一個jdbcTemplate不就行了。其實在這樣做的時候,我也在想一個問題,我在jdbcTemplate上標注的那個@Autowired注解有何用?但沒辦法,此時我沒有其他更好的辦法了,於是我就這樣試了一試。我抱着一絲的殘念,祈禱上蒼,結果就是出現了No dataSource specified這個異常。
解決:方式就是第一個問題的解決方式。