1 回答
TA貢獻1993條經(jīng)驗 獲得超6個贊
你不需要上下文;有更好的方法。
ApplicationContextAware是許多舊版本 Spring 的產(chǎn)物,在許多現(xiàn)在的標準功能可用之前。在現(xiàn)代 Spring 中,如果您需要ApplicationContext,只需像注入任何其他 bean 一樣注入它。但是,您幾乎可以肯定不應(yīng)該直接與它交互,尤其是對于getBean,應(yīng)該將其替換為注入您得到的任何東西。
一般來說,當你需要一個 Spring bean 時,你應(yīng)該將它聲明為構(gòu)造函數(shù)參數(shù)。(如果你有多個構(gòu)造函數(shù),你需要用 注釋一個@Autowired,但如果只有一個構(gòu)造函數(shù),Spring 足夠聰明知道使用它。)如果你正在使用 Lombok,你可以使用 來@Value自動編寫構(gòu)造函數(shù),并且Groovy 和 Kotlin 具有相似的功能。
在您在這里展示的 Micrometer 的特定情況下,將單個指標聲明為 beans 是不常見的,因為它們是旨在應(yīng)用于特定代碼路徑的細粒度工具。(某些服務(wù)可能有 10 個單獨的指標來跟蹤各種可能的情況。)相反,您注入MeterRegistry并選擇您需要的計數(shù)器或其他指標作為構(gòu)造函數(shù)的一部分。在這里,您的控制器類應(yīng)該如下所示。(我已經(jīng)刪除了重復(fù)項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));
}
}
添加回答
舉報
