ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • IoC 컨테이너와 빈(5) - ApplicationEventPublisher
    카테고리 없음 2020. 3. 19. 00:10
    반응형
    @Controller
    public class HomeController {
    	@Autowired
    	private ApplicationEventPublisher publishEvent;
    	
    	@RequestMapping(value = "/", method = RequestMethod.GET)
    	public String home(Locale locale, Model model)  throws Exception{
    		// 발생되어있는 이벤트를 등록되어있는 빈중에서 데이터를 출력
    		publishEvent.publishEvent(new MyEvent(this, 100));
    		return "home";
    	}
    }
    public class MyEvent {
    	private int data;
    	private Object source;
    
    	public MyEvent(Object source, int data) {
    		this.source = source;
    		this.data = data;
    	}
    
    	public Object getSource() {
    		return source;
    	}
    
    	public int getData() {
    		return data;
    	}
    }
    @Component
    public class MyEventHandler {
    
    	@EventListener
    	public void handler(MyEvent event) {
    		System.out.println("이벤트 받았다. 데이터는 " + event.getData());
    	}
    }

     

    MyEvent Class는 스프링 프레임워크에 종속되어있지 않다. -> POJO 

     

     

    특이사항

    • ApplicationEvent 상송 스프링 4.2 부터는 이 클래스를 상속받지 않아도 이벤트로 사용할 수 있다.

     

    이벤트 발생 시키는 방법 

    • ApplicationEventPublisher.publishEvent();

     

    이벤트 처리하는 방법 

    @Component
    public class MyEventHandler {
    	@EventListener
    	@Async
    	public void handler(MyEvent event) {
    		System.out.println(Thread.currentThread().toString());
    		System.out.println("이벤트 받았다. 데이터는 " + event.getData());
    	}
    	@EventListener
    	@Async
    	public void handler2(MyEvent event) {
    		System.out.println(Thread.currentThread().toString());
    		System.out.println("이벤트 받았다. 데이터는 " + event.getData());
    	}
    	@EventListener
    	@Async
    	public void handler3(MyEvent event) {
    		System.out.println(Thread.currentThread().toString());
    		System.out.println("이벤트 받았다. 데이터는 " + event.getData());
    	}
    }
    
    @Component
    public class AnotherHandler {
    	@EventListener
    	@Order(Ordered.HIGHEST_PRECEDENCE)
    	public void handler(MyEvent event) {
    		System.out.println(Thread.currentThread().toString());
    		System.out.println("Another " + event.getData());
    	}
        @EventListener
    	@Order(Ordered.HIGHEST_PRECEDENCE + 48)
    	public void handler2(MyEvent event) {
    		System.out.println(Thread.currentThread().toString());
    		System.out.println("Another " + event.getData());
    	}
    }
    • ApplicationListener<이벤트> 구현한 클래스 만들어서 빈으로 등록하기. 
    • 스프링 4.2 부터는 @EventListener를 사용해서 빈의 메소드에 사용할 수 있다. 
    • 기본적으로는 synchronized. 
    • 순서를 정하고 싶다면 @Order와 함께 사용. 
      • 뒤에 + 를 붙이게 된다면 나중에 실행
    • 비동기적으로 실행하고 싶다면 @Async와 함께 사용. 

     

     

    스프링이 제공하는 기본 이벤트 

    • ContextRefreshedEvent: ApplicationContext를 초기화 했더나 리프래시 했을 때 발생. 
    • ContextStartedEvent: ApplicationContext를 start()하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생. 
    • ContextStoppedEvent: ApplicationContext를 stop()하여 라이프사이클 빈들이 정지 신호를 받은 시점에 발생. 
    • ContextClosedEvent: ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에 발생. 
    • RequestHandledEvent: HTTP 요청을 처리했을 때 발생.

     

     

    반응형
Designed by Tistory.