在使用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 {
//省略的代碼
}
如文中有不合理之處,請各位批評指正。