2017-01-04 2 views
0

나는 이와 같이 SpringApplicationRunListener 구현을 가지고있다. 정적 메소드 나 변수를 사용하지 않고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; 
    } 
} 

, 어떻게 getAppStartTimestamp()getAppFinishTimestamp() 기능 두 변수를 얻을 수를 호출 할 수 있습니다? AppListener의 새 인스턴스를 초기화하기 때문에 코드가 작동하지 않습니다.

AppListener appListener = new AppListener(new SpringApplicationBuilder(Application.class).build(), null); 
appStartTimestamp = appListener.getAppStartTimestamp(); // 0 
appFinishTimestamp = appListener.getAppFinishTimestamp(); // 0 

나는 봄이 빈 관리를 시작하기 전에 호출되기 때문에 AppListener는 콩으로 만들어 질 수 없음을 찾을 수 있습니다. 실행중인 AppListener 인스턴스가 두 get 함수를 호출하도록하는 방법이 있습니까? 감사.

답변

0

이제 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; 
    } 
} 

에 시작 시간 값을 넣어 마무리 이제 리스너 클래스의 당신의 마무리 방법을 업데이트 응용 프로그램 이벤트 데이터

@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; 
    } 
} 

을 유지하는 POJO를 수행 할 수 있습니다 만들기 POJO에서 데이터를 가져 오려면 예를 들어 주된 방법을 보여주고 있습니다.

@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()); 
    } 
} 

그것은 이루어집니다 ....

아래 그렇지 않으면 리스너가 실행되지 않습니다 같은 src/main/resources/META-INF/spring.factories에 리스너를 넣어하는 것을 잊지 마십시오.

org.springframework.boot.SpringApplicationRunListener=com.app.AppListener 
+0

놀라운 아이디어. 그것은 작동합니다! 고맙습니다! 왜냐하면 나는 다른 클래스에서'AppEventData'를 사용하고 있기 때문에, 나는 단지 autowire를 사용한다. – NMSL