后台读取applicationContext.xml引发的奇葩问题
SpringMVC整合ibatis时,写了一个测试方法,运行正常,当运行另一个方法时报找不到对应的路径。此处无法理解,为什么同样规则的请求,第一次能够拦截第二次却提示找不到对应的处理方法。
后来将添加的第二个方法逐一注释掉,才发现在Dao层中读取applicationContext.xml时,为了让dao层的各方法共用一个applicationContext.xml,我将读取它的代码提取了出来,作为成员变量
处理了。后将每个dao方法添加同样的读取代码后,程序正常运行。添加代码如下:
ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml"); SqlMapClient sqlMapClient=(SqlMapClient) context.getBean("sqlMapClient");
猜测原因为:spring配置文件中bean默认为单例模式导致。后续将对该问题进行测试。
————————————————————————————————————————————————————————
为解决共用SqlMapClient的问题,我们可以提供一个BaseDao。
public class BaseDao extends SqlMapClientDaoSupport{ @Resource(name="sqlMapClient") private SqlMapClient sqlMapClient; @PostConstruct public void initSqlMapClient(){ super.setSqlMapClient(sqlMapClient); } }
dao层继承BaseDao之后,便能使用SqlMapClientDaoSupport提取的静态方法:
getSqlMapClient().queryForObject("user.findById",id);//使用此方法时可将applicationContext.xml中的sqlMapClientTemplate bean去掉。