632*_*324 1 spring spring-boot
我有一个像这样的SpringApplicationRunListener实现。
public class AppListener implements SpringApplicationRunListener {
private long appStartTimestamp;
private long appFinishTimestamp;
public AppListener(SpringApplication application, String[] args) {
}
@Override
public void started() {
appStartTimestamp = System.currentTimeMillis();
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
//Not used.
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
//Not used.
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
//Not used.
}
@Override
public void finished(ConfigurableApplicationContext context, Throwable exception) {
appFinishTimestamp = System.currentTimeMillis();
}
public long getAppStartTimestamp() {
return appStartTimestamp;
}
public long getAppFinishTimestamp() {
return appFinishTimestamp;
}
}
Run Code Online (Sandbox Code Playgroud)
在不使用任何静态方法或变量的情况下,如何调用getAppStartTimestamp()andgetAppFinishTimestamp()函数来获取这两个变量?下面的代码不起作用,因为我初始化了AppListener.
AppListener appListener = new AppListener(new SpringApplicationBuilder(Application.class).build(), null);
appStartTimestamp = appListener.getAppStartTimestamp(); // 0
appFinishTimestamp = appListener.getAppFinishTimestamp(); // 0
Run Code Online (Sandbox Code Playgroud)
我发现它AppListener不能作为一个bean,因为它是在Spring开始bean管理之前调用的。有没有办法让运行AppListener实例调用这两个get函数?谢谢。
创建 POJO 来保存应用程序事件数据
@Component
public class AppEventData {
private long appStartTimestamp;
private long appFinishTimestamp;
public long getAppStartTimestamp() {
return appStartTimestamp;
}
public void setAppStartTimestamp(long appStartTimestamp) {
this.appStartTimestamp = appStartTimestamp;
}
public long getAppFinishTimestamp() {
return appFinishTimestamp;
}
public void setAppFinishTimestamp(long appFinishTimestamp) {
this.appFinishTimestamp = appFinishTimestamp;
}
}
Run Code Online (Sandbox Code Playgroud)
现在更新侦听器类的完成方法,将开始时间和结束时间的值放入 POJO 中
public class AppListener implements SpringApplicationRunListener {
private long appStartTimestamp;
private long appFinishTimestamp;
public AppListener(SpringApplication application, String[] args) {
super();
}
@Override
public void started() {
appStartTimestamp = System.currentTimeMillis();
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
//Not used.
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
//Not used.
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
//Not used.
}
@Override
public void finished(ConfigurableApplicationContext context, Throwable exception) {
appFinishTimestamp = System.currentTimeMillis();
AppEventData data = context.getBean(AppEventData.class);
data.setAppStartTimestamp(appStartTimestamp);
data.setAppFinishTimestamp(appFinishTimestamp);
}
public long getAppStartTimestamp() {
return appStartTimestamp;
}
public long getAppFinishTimestamp() {
return appFinishTimestamp;
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以从任何地方从 POJO 获取数据,例如我向您展示 main 方法。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
AppEventData data = ctx.getBean(AppEventData.class);
System.out.println(data.getAppStartTimestamp());
System.out.println(data.getAppFinishTimestamp());
}
}
Run Code Online (Sandbox Code Playgroud)
完成....
不要忘记将侦听器放入
src/main/resources/META-INF/spring.factories如下所示,否则侦听器将不会运行。
org.springframework.boot.SpringApplicationRunListener=com.app.AppListener
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3339 次 |
| 最近记录: |