Spring Boot 1.5.10中ResourceProcessor注入@Autowired服务的技术咨询
问题分析与解决方案
这种写法其实是不合规的,而且大概率会在运行时踩坑——你的orderHandler很大概率会是null,然后抛出NullPointerException。
问题根源
Spring的依赖注入机制管不到匿名内部类里的字段:你用@Bean声明的orderResourceProcessor是Spring管理的Bean,但里面的匿名ResourceProcessor实例并不是Spring容器中的Bean。Spring不会扫描匿名类内部的@Autowired注解,自然不会给你注入OrderHandler。
调整方案
这里有几种规范的实现方式,按推荐程度排序:
方案1:将依赖作为@Bean方法的参数注入(最简洁)
直接把OrderHandler作为orderResourceProcessor方法的参数传入,匿名类可以直接引用这个外部变量(Java 8及以上支持引用effectively final的变量):
@Bean public ResourceProcessor<Resource<Order>> orderResourceProcessor(OrderHandler orderHandler) { return new ResourceProcessor<Resource<Order>>() { @Override public Resource<Order> process(Resource<Order> resource) { Order order = resource.getContent(); Payment payment = orderHandler.payment(order); // 你的其他业务逻辑 return resource; } }; }
方案2:将处理器改为独立的Spring管理类(最易维护)
如果你的处理器逻辑比较复杂,推荐把它抽成独立的类,加上@Component让Spring管理,这样就能正常使用依赖注入了:
@Component public class OrderResourceProcessor implements ResourceProcessor<Resource<Order>> { private final OrderHandler orderHandler; // Spring 4.3+支持省略构造方法上的@Autowired public OrderResourceProcessor(OrderHandler orderHandler) { this.orderHandler = orderHandler; } @Override public Resource<Order> process(Resource<Order> resource) { Order order = resource.getContent(); Payment payment = orderHandler.payment(order); // 你的其他业务逻辑 return resource; } }
这种方式不仅符合Spring的Bean管理规范,还更便于单元测试和代码维护。
方案3:手动从ApplicationContext获取依赖(不推荐)
如果一定要用匿名类,也可以通过ApplicationContext手动获取Bean,但这种方式会增加代码与Spring容器的耦合,不推荐:
@Bean public ResourceProcessor<Resource<Order>> orderResourceProcessor(ApplicationContext context) { return new ResourceProcessor<Resource<Order>>() { private OrderHandler orderHandler; @Override public Resource<Order> process(Resource<Order> resource) { // 懒加载获取Bean if (orderHandler == null) { orderHandler = context.getBean(OrderHandler.class); } Order order = resource.getContent(); Payment payment = orderHandler.payment(order); // 你的其他业务逻辑 return resource; } }; }
总结
优先选择方案1或方案2,既能避免空指针问题,又符合Spring的依赖注入设计理念。
内容的提问来源于stack exchange,提问作者Jan Nielsen
相关产品推荐
相关产品推荐

