You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:45