项目中mapper.java 和dao.java文件的内容是一样的,所以我做了整合,把mapper.java删掉掉了,用dao.java代替。同时把xml中的namespace指向了dao。
但是项目运行的时候出现了问题,发现程序执行过程不经过daoImpl。在service层直接进入了xml的sql代码中。
理了理逻辑,daoImpl上写了@Repository, service层中的dao变量上面也写了@AutoWrited ,发现spring的注入过程没有问题,于是单步调试,发现在service层中,spring 往dao变量注入的不是daoImpl,而是mybtis经过动态代理生成的对象
原因:
spring扫描xml中指定的namespace接口类,并自动为其生成实现的bean。
如:<mapper namespace="com.dataaccess.gag.dao.CommentDao"/>
spring 就根据xml,动态代理生成了名字为commentDao的bean。在service层中发现
@Autowired
private CommentDao commentDao;
的时候,就把动态代理生成的commentDao的bean注入了进去(尽管你在CommentDaoImpl上面写了@Repository),所以程序运行的时候就无法进入DaoImpl中的代码。
解决:
①dao跟mapper都要有,分开管理,xml中的namespace指向mapper,即使两个类中的内容是一样的。
②自定义bean名称
生成bean:
@Repository("what_you_want")
public class CommentDaoImpl
注入bean:
@Autowired
@Qualifier("what_you_want")
private CommentDao commentDao;
这样在service中往dao变量注入的就是daoImpl。