作者:琦琦蔡外_734 | 来源:互联网 | 2023-08-23 09:54
SpringBoot项目中经常使用到@AutoWire注解实现自动注入,但是经常会出现自动注入失败的情况,这里汇总一下注入失败的情况,便于快速定位错误。先上测试项目内容——
项目目录结构:
.yml文件:
test:name: roseage: 18
#端口号修改为8081
server:port: 8081
User类(使用lombok工具类,省去了get、set方法):
@Component
@ConfigurationProperties(prefix="test")
@Getter
@Setter
public class User {private String name;private String age;
}
接口:
public interface IUserService {public String getUser();
}
实现类:
@Service
public class UserService implements IUserService{@Autowiredprivate User user;@Overridepublic String getUser(){return "name:" + user.getName() + " age:" + user.getAge();}
}
控制类:
@Controller
public class UserController {@AutowiredUserService userService;@ResponseBody@RequestMapping("/test")public String test(){return userService.getUser();}
}
1.检查类上是否加了注解
自动注入的类上需要加上注解,如@Repository、@Service,需要注意的是注解需要放在实现类上,而不是接口上。
2.确认包是否被正确扫描到
springBoot项目的Bean的默认装配规则是根据Application类所在的包位置从上往下扫描。
Application类是SpringBoot项目入口类,本项目Application类所在的包为com.example.springtest1,则只会扫描com.example.springtest1包及其所有子包。若需要@Autowire注入的类(service、dao所在包)不在com.example.springtest1及其子包下,则不会被扫描。因此需要把Application类放到需要@Autowire注入的类(service、dao所在包)的上级。
3.调用者是用new创建的
比如项目中控制类UserService中存在成员变量User,User是通过@Autowired自动注入的,若控制类UserController中UserService是通过new创建的,那么自动注入就会失效。例如:
@Controller
public class UserController {
// @Autowired
// UserService userService;@ResponseBody@RequestMapping("/test")public String test(){UserService userService = new UserService();return userService.getUser();}
报错: