¿Por qué mi campo Spring @Autowired es nulo?


Nota: Esto pretende ser una respuesta canónica para un problema común.

Tengo una clase Spring @Service (MileageFeeCalculator) que tiene un campo @Autowired (rateService), pero el campo es null cuando intento usarlo. Los registros muestran que tanto el frijol MileageFeeCalculator como el frijol MileageRateService se están creando, pero obtengo un NullPointerException cada vez que intento llamar al método mileageCharge en mi frijol de servicio. ¿Por qué no está Spring autowiring el campo?

Clase de controlador:

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

Servicio clase:

@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
    }
}

Frijol de servicio que debe ser autowired en MileageFeeCalculator pero no lo es:

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

Cuando intento GET /mileage/3, obtengo esta excepción: {[18]]}

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)
    ...

Warning: Undefined property: agent_blog_content::$date_asked in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 32

Warning: Undefined property: agent_blog_content::$count_answers in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 52