天天看點

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