SPRING
스프링 이벤트 프로그래밍 -ApplicationEventPublisher
JUMP개발자
2020. 4. 19. 18:21
ApplicationEventPublisher는 스프링에서 이벤트 프로그래밍에 필요한 인터페이스를 제공한다.
ApplicationContext가 이미 ApplicationEventPublisher를 상속하고 있기 때문에 ApplicationContext에서도 사용이 가능하다.
실습 : AppRunner에 이벤트를 발생시킨다.
아래와 같이 publishEvent 메서드를 이용하여 이벤트를 발생시킬 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.example.demo;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationEventPublisher publishEvent;
@Override
public void run(ApplicationArguments args) throws Exception {
// TODO Auto-generated method stub
publishEvent.publishEvent(new MyEvent(this,100));
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
MyEvent 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.example.demo;
import org.springframework.context.ApplicationEvent;
public class MyEvent extends ApplicationEvent{
private int data;
public MyEvent(Object source) {
super(source);
// TODO Auto-generated constructor stub
}
public MyEvent(Object source, int data) {
super(source);
this.data = data;
}
public int getData() {
return data;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
1. 스프링 4.2 버전 부터는 아래와 같이 ApplicationEvent를 상속받지 않아도
이벤트로 사용이 가능하다. 아래와 같이 사용하면 2번과 같이 EventHandler를 별도로 작성
할 필요가 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package com.example.demo;
import org.springframework.stereotype.Component;
@Component
public class AnotherEvent {
@EventListener
public void handle(MyEvent myEvent) {
System.out.println(Thread.currentThread().toString());
System.out.println("Another " + myEvent.getData());
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
2. MyEvent의 경우에는 아래와 같이 EventHandler를 작성하여 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.example.demo;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyEventHandler implements ApplicationListener<MyEvent>{
@Override
@Order(Ordered.HIGHEST_PRECEDENCE + 2)
public void onApplicationEvent(MyEvent event) {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().toString());
System.out.println("이벤트 받았습니다. 데이터 : " + event.getData());
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
3. @Order 어노테이션
여러 핸들러를 추가하고 난 후 그 Handler의 이벤트를 수신할 시 순서를 정하고 싶을 떄 Order 어노테이션을 사용하면
된다. HIGHEST_PRECEDENCE의 값이 낮을 수록 우선순위가 높기 때문에 먼저 실행이 된다.