1 回答

TA貢獻1993條經驗 獲得超6個贊
你不需要上下文;有更好的方法。
ApplicationContextAware是許多舊版本 Spring 的產物,在許多現在的標準功能可用之前。在現代 Spring 中,如果您需要ApplicationContext,只需像注入任何其他 bean 一樣注入它。但是,您幾乎可以肯定不應該直接與它交互,尤其是對于getBean,應該將其替換為注入您得到的任何東西。
一般來說,當你需要一個 Spring bean 時,你應該將它聲明為構造函數參數。(如果你有多個構造函數,你需要用 注釋一個@Autowired,但如果只有一個構造函數,Spring 足夠聰明知道使用它。)如果你正在使用 Lombok,你可以使用 來@Value自動編寫構造函數,并且Groovy 和 Kotlin 具有相似的功能。
在您在這里展示的 Micrometer 的特定情況下,將單個指標聲明為 beans 是不常見的,因為它們是旨在應用于特定代碼路徑的細粒度工具。(某些服務可能有 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));
}
}
添加回答
舉報