今天在写SpringBoot集成SpringMVC和Mybatis时遇到了关于bean注入失败一个问题,上网一搜,结果本来对注解很懵逼的我,搜了后更懵逼了,先来看出现的问题:
一、问题
文章图片
这是错误,后面没截图到的是:that could not be found
这句话大概意思就是:
Description:在你的UsersController类下面需要获取的UsersService类型的这个bean不能被找到
下面给你的建议就是:
Action:在配置类或者配置文件中定义一个UsersService的类型的bean
下面我来展示我原有的代码:
Controller类:
@Controller
@RequestMapping("/users")
public class UsersController {
@Autowired
private UsersService usersService;
/**
* 页面跳转
*/
@RequestMapping("{page}")
public String showPage(@PathVariable String page){
return page;
}
//添加用户
@RequestMapping("/addUser")
public String addUser(Users users){
this.usersService.addUser(users);
return "ok";
}
}
Service接口类:
public interface UsersService {
public void addUser(Users users);
}
Service接口的实现类:
@Service
@Transactional
public class UsersServiceImpl implements UsersService{
@Autowired
private UsersMapper userMapper;
@Override
public void addUser(Users users) {
this.userMapper.insertUser(users);
}}
Dao层的接口
public interface UsersMapper {
void insertUser(Users users);
}
二、解决 出现了这个错误,我们从起点开始找,首先我在SpringBoot启动类中用了@SpringBootApplication这个注解,这个注解里包含了@ComponentScan注解,也就是在controller,service,dao层中的注解都会被扫描到,然后检查Controller类中需要注入的service接口是否是正确的,在这里有几种注入的方式:
我用的是@Autowired自动注入,因为这里只有一个service接口的实现类,所以自动注入的话,不会出现注入二义性,注意,还需要检查你的service接口实现类中是否有@Service这个注解
1、当然你可以把在controller类中注入的service接口属性名改为usersServiceImpl,它会根据命名规范,自动匹配寻找UsersSericeImpl的bean,也会把第一个首字母小写,即:
@Controller
@RequestMapping("/users")
public class UsersController {
@Autowired
private UsersService usersServiceImpl;
/**
* 略
*/
}
@Service
@Transactional
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper;
/**
*略
*/
}
2、如果有多个service接口的实现类时,可能就会产生二义性,使用@Qualifier消除二义性:
@Controller
@RequestMapping("/users")
public class UsersController {
@Autowired
@Qualifier(value="https://www.it610.com/article/usersServiceImpl1")
private UsersService usersServiceImpl;
/**
* 略
*/
}
同时,你得在service实现类中需要有指定@Service(value="https://www.it610.com/article/usersServiceImpl1")
@Service(value="https://www.it610.com/article/usersServiceImpl1")
@Transactional
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper;
/**
*略
*/
}
3、直接指出你需要注入的bean@Resource(name="usersServiceImpl1")
@Controller
@RequestMapping("/users")
public class UsersController { @Resource(name="usersServiceImpl1")
private UsersService usersServiceImpl;
/**
* 略
*/}
我们发现使用@Resource注解也就是不需要自动注入了,大多数我觉得还是使用自动注入的多,搭配@Qualifier来使用,没有企业级的实践,我也搞不清楚这些注解的利弊。我还是个小白白,有什么问题,大家一起探讨
【Consider defining a bean of type的问题】
推荐阅读
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- java人生|35K 入职华为Java开发那天,我哭了(这 5 个月做的一切都值了)
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- 微服务|微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
- java|ApplicationListener和SpringApplicationRunListener的联系
- Spring|SpringSecurity--自定义登录页面、注销登录配置
- 性能|性能工具之 Jmeter 通过 SpringBoot 工程启动
- 代码狂魔|Spring源码分析之IOC容器初始化流程