欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Spring(注解+xml配置两掺)搭建service层和dao层测试环境时,测试类中无法实例化service层的对象引用,抛出NoSuchBeanDefinitionException异常

程序员文章站 2022-04-30 20:00:00
...

在使用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 {
	//省略的代码
}

如文中有不合理之处,请各位批评指正。