Consider defining a bean of type的问题

今天在写SpringBoot集成SpringMVC和Mybatis时遇到了关于bean注入失败一个问题,上网一搜,结果本来对注解很懵逼的我,搜了后更懵逼了,先来看出现的问题:
一、问题 Consider defining a bean of type的问题
文章图片

这是错误,后面没截图到的是: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的问题】

    推荐阅读