使用Spring(注解+xml配置两掺)搭建service层和dao层测试环境时,测试类中无法实例化service层的对象引用,抛出NoSuchBeanDefinitionException异常
在使用Spring框架搭建service层和dao层测试环境时,测试类中无法实例化service层,抛出 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘userService’ available 异常。。
修改之前的主要代码:
1:Spring配置文件applicationContext.xml中的配置
<!--开启包扫描-->
<context:component-scan base-package="xx.xxx"></context:component-scan>
2:dao层实现类UserDaoImpl 中代码
@Repository
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println(" saving ....... ");
}
}
3:service层实现类UserServiceImpl 中代码
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
4:测试类SpringTest 中代码
public class SpringTest {
@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) ac.getBean("userService");
userService.save();
}
}
测试类抛异常NoSuchBeanDefinitionException原因?
在执行ApplicationContext 的API:applicationContext.getBean(“userService”)时,引用名userService未在Spring容器中找到其对应的实现类。
在Spring框架中,由于在使用注解方式让Spring框架管理类时,实现类默认引用名规则为 类名、首字母小写 ,如:“UserServiceImpl ”引用名为“userServiceImpl ”、“UserDaoImpl ”引用名为“userDaoImpl ”,而非“userService”和“userDao”。
该问题解决方案:
第一种:
修改测试类SpringTest 中引用名:
UserService userService = (UserService) ac.getBean("userService");
改为:
UserService userService = (UserService) ac.getBean("userServiceImpl");
第二种:
在UserServiceImpl 类上加注解@Service时,为该注解声明value属性:即@Service(“userService”),代码如下:
@Service("userService")
public class UserServiceImpl implements UserService {
//省略的代码
}
如文中有不合理之处,请各位批评指正。
上一篇: liunx下copy 指令的 实现