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

  • Post author:
  • Post category:其他


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

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



版权声明:本文为weixin_45429218原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。