1.前因:
需要在一个类中注入一个mapper类操作数据库,选择用@Autowired注解注入。
public class XXXClass {
private int size = 10000;
@Autowired
private XxxMapper xxxMapper;
public XXXClass (int size) {
this.size = size;
}
}
2.问题:
后发现此类未加spring框架中@Service,@Repository,@Component,@Controller其中任何一个注解,因此注入失败,mapper为null。
后又在此类上加了@Component注解,启动报错,信息如下:
Description:
Parameter 0 of constructor in com.xxx.service.impl.xxx required a bean of type ‘java.lang.int’ that could not be found.
3.原因:
此类手动定义了有参构造,则默认的无参构造方法失效。所以只能调这个类的有参构造来创建此对象,而@Component注解注入时调用的是无参构造,未传参数调有参构造,因此报以上错误。
4.最终解决方案:
通过有参构造注入需要的mapper类,不通过@Autowired注解注入。
public XXXClass (int size, XxxMapper xxxMapper) {
this.size = size;
this.xxxMapper= xxxMapper;
}
5.遗留问题未解
如是因缺失无参构造方法,而调用了有参构造初始化对象,最终因缺失参数而报错。那么给该对象手动加一个无参构造应该也可以解决,但试验发现mapper注入还是为null,未找到原因。