Consider defining a bean of type的问题

今天在写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="usersServiceImpl1")
	private UsersService usersServiceImpl;
	/**
	 * 略
	 */
}

同时,你得在service实现类中需要有指定@Service(value="usersServiceImpl1")

@Service(value="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来使用,没有企业级的实践,我也搞不清楚这些注解的利弊。我还是个小白白,有什么问题,大家一起探讨

 

  • 19
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值