tl; dr: вам не нужен контекст; есть лучший способ.
ApplicationContextAware
- это артефакт из более старых версий Spring, еще до того, как стали доступны многие стандартные функции. В современной Spring, если вам нужен ApplicationContext
, просто введите его, как любой другой боб. Тем не менее, вы почти наверняка не должны взаимодействовать с ним напрямую, особенно для getBean
, который следует заменить введением того, что вы получили.
В общем, когда вам нужен bean-компонент Spring, вы должны объявить его как параметр конструктора. (Если у вас есть несколько конструкторов, вам нужно аннотировать один с помощью @Autowired
, но если есть только один конструктор, Spring достаточно умен, чтобы знать, как его использовать.) Если вы используете Lombok, вы можете использовать @Value
для автоматически напишите конструктор, и Groovy и Kotlin имеют схожие функции.
В конкретном случае Micrometer, который вы здесь показываете, не принято объявлять отдельные метрики в виде bean-компонентов, поскольку они являются детализированными инструментами, предназначенными для применения к конкретным путям кода. (Некоторые службы могут иметь 10 отдельных метрик для отслеживания различных возможных сценариев.) Вместо этого вы вводите MeterRegistry
и выбираете счетчики или другие метрики, которые вам нужны, как часть вашего конструктора. Здесь ваш класс контроллера должен выглядеть следующим образом. (Я удалил дубликат AtomicLong
, но вы можете добавить его обратно, как показано, если есть какая-то конкретная причина, по которой он вам нужен.)
@RestController
public class GreetingController {
private static final Logger LOG = LoggerFactory.getLogger(GreetingController.class);
private static final String template = "Hello, %s!";
private final Counter counter;
public GreetingController(MeterRegistry meterRegistry) {
counter = meterRegistry.counter("my.counter");
}
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
counter.increment();
long count = (long) counter.count();
return new Greeting(count, String.format(template, name));
}
}