1 回答
TA贡献1993条经验 获得超5个赞
你不需要上下文;有更好的方法。
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));
}
}
添加回答
举报