现象
在类中使用 @Autowired 注入 Bean,运行时为 null。
代码如下:
@Service
public class UserService {
@Autowired
private OrderService orderService;
public void test() {
orderService.create();
}
}
运行时抛出:
排查
发现该类是通过 new 手动创建的:
UserService userService = new UserService();
userService.test();
这种方式不会经过 Spring 容器管理。
@Autowired 只有在对象由 Spring 创建时才会生效。
处理方式
改为从容器中获取 Bean:
@Autowired
private UserService userService;
或者:
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
另外一种情况
@Component 扫描路径未包含该类所在包。
启动类如果在其他包下,可能扫描不到。
需要确认:
@ComponentScan("com.example")
或者保证启动类在顶层包。
补充
如果字段是 static:
@Autowired
private static OrderService orderService;
也会注入失败。
Spring 不会给 static 成员注入。