为什么我的Spring @Autowired字段为空?

769

注意:这是针对常见问题的标准答案。

我有一个Spring的@Service类(MileageFeeCalculator),其中有一个@Autowired字段(rateService),但当我尝试使用它时,该字段为null。日志显示,MileageFeeCalculator bean和MileageRateService bean都被创建了,但是每当我尝试调用我的服务bean上的mileageCharge方法时,就会出现NullPointerException。为什么Spring没有自动装配该字段?

控制器类:

@Controller
public class MileageFeeController {    
    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        MileageFeeCalculator calc = new MileageFeeCalculator();
        return calc.mileageCharge(miles);
    }
}

服务类:

@Service
public class MileageFeeCalculator {

    @Autowired
    private MileageRateService rateService; // <--- should be autowired, is null

    public float mileageCharge(final int miles) {
        return (miles * rateService.ratePerMile()); // <--- throws NPE
    }
}

应该自动装配到 MileageFeeCalculator 中的服务 bean,但它没有被自动装配:

@Service
public class MileageRateService {
    public float ratePerMile() {
        return 0.565f;
    }
}

当我尝试执行GET /mileage/3时,我会收到以下异常:
java.lang.NullPointerException: null
    at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge(MileageFeeCalculator.java:13)
    at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee(MileageFeeController.java:14)
    ...

6
另一种情况是当一个名为F的Bean在另一个名为S的Bean的构造函数中被调用时。在这种情况下,将所需的F Bean作为参数传递给其他Beans S构造函数,并在S的构造函数上注释@Autowire。记得要在第一个BeanF的类上注释@Component - aliopi
2
我使用Gradle编码了几个非常类似于这个的示例,链接在这里:https://github.com/swimorsink/spring-aspectj-examples。希望对某些人有用。 - Ross117
21个回答

-6
如果您正在使用“private”方法,它将会为“null”,请尝试在控制器中将“private”更改为“public”。

我认为访问修饰符在这里没有任何作用。 - ennth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接