现象

在类中使用 @Autowired 注入 Bean,运行时为 null。

代码如下:

@Service
public class UserService {

    @Autowired
    private OrderService orderService;

    public void test() {
        orderService.create();
    }
}

运行时抛出:

NullPointerException

排查

发现该类是通过 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 成员注入。