昨天新搭建了一个Spring的框架,采用版本为3.2.5.RELEASE,现在spring版本都更新到4.x多了,一直都没有比较新版本的新特性,后面需要抽时间比较一下。
言归正传,在TestNG的测试代码无法注入Bean,通过一个晚上加一个上午的捣腾,终于解决,记录一下!
可能解决问题点有四:(不断捣腾,分不清哪个是主要原因了)
1、testNG测试类的@ContextConfiguration(locations = {“Spring的xml配置文件路径” })的配置问题。
2、对于父类所需的属性注解注入问题(dataSource注入)
3、关于@Inject、@Qualifier("XXX")、@Resource(name="XXX")使用的问题
4、Spring xml配置文件第一行不能为空的问题(这个也许真的不是原因)
一、testNG测试类的@ContextConfiguration(locations = {"classpath*:ApplicationContext.xml"})的配置问题
感觉问题就出在这呀,但还是没找到解决方法。
应该就是locations路径的问题。
以前的应用采用maven的model进行了分包,所有的xml配置放在conf包中,conf包中的xml采用classpath*:加载是没有问题的。
这次由于功能相对简单,不想做那么多层的分包,把xml文档都放在src/main/resources和src/test/resources文件夹下,classpath*:是否能访问得到?上网还没找到答案呢,待续~~~
二、对于父类所需的属性注解注入问题
对于父类的属性通过xml的配置,是很容易实现注入的,但对于注解注入方式,就需要注意一下,需重载父类的参数,然后使用resource注解。
比如 UserDao 继承于 BaseDao;BaseDao继承于JdbcDaoSupport,JdbcDaoSupport需要注入dataSource,而且JdbcDaoSupport的dataSource为private变量,get/set方法不允许重载,如何使用注解注入dataSource呢?
方法:在BaseDao定义如下代码,实现dataSource注入! BaseDao 的所有子类很方便使用JdbcDaoSupport使用的方法了。
private DataSource dataSourceTemp;
@Resource(name="dataSource")
public void setDataSourceTemp(DataSource dataSourceTemp) {
this.dataSourceTemp = dataSourceTemp;
super.setDataSource(dataSourceTemp);
}
三、关于@Inject、@Qualifier("XXX")、@Resource(name="XXX")
testNG问题似乎不在此,但还是记录一下。
对于@Named注解的类,使用@Inject和@Resource(name="XXX")都能够注入。
四、其它
spring的xml是有加载先后顺序的,另注意一下<context:annotation-config />和<mvc:annotation-driven />的区别。