问题设计的关键类及方法:

如下

@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这个异常。

 

解决:方式就是第一个问题的解决方式。