ApplicationContext를 중개자 삼아서 Event를 발생시키거나 처리 할 수 있습니다. Event는  ApplicationEvent 클래스를 상속하여 만들 수 있으며 Event를 처리 할 클래스는 ApplicaionListener 인터페이스를 구현하면 됩니다.

Reference에 나와있는 예제는 email을 보낼 때 Black List에 있는 email 주소로는 email을 보내지 않고 BlackListEvent를 발생시키고 이 이벤트가 발생하면 담당자에게 알리도록 하는 핸들러가 작동하게 됩니다.

먼저 ApplicationEvent를 상속하여 BlackListEvent를 만들겠습니다.

import org.springframework.context.ApplicationEvent;

public class BlackListEvent extends ApplicationEvent {

    private String message;

    public BlackListEvent(Object souce, String message) {
        super(souce);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

이 때 ApplicationContext의 생성자가 주의해야 합니다. 인자가 하나인 생성자 하나밖에 없기 때문에 super()를 사용해서 명시적으로 호출해 줘야 합니다.

다음은 ApplicationListener를 구현하는  BlackListEvent를 처리할 BlackListNotifier를 만들겠습니다.

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class BlackListNotifier implements ApplicationListener {

    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof BlackListEvent)
            System.out.println("메일 보내지마~");
    }
}

구현해야 할 메소드는 onApplicationEvent 하나 입니다.

그럼 이제 위에서 만든 BlackListEvent를 특정 상황에서 발생시켜야 하는데요. ApplicationContext의 publishEvent() 메소드를 이용하면 됩니다. 그럼 이벤트를 발생 시킬 클래스에서 ApplicationContext를 알고 있어야 하니까 ApplicationContextAware 인터페이스를 구현해야겠습니다.
ApplicationContextAware 인터페이스를 구현한 EmailBean을 만듭니다.

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class EmailBean implements ApplicationContextAware {

    private List blackList;

    private ApplicationContext ctx;

    public void setBlackList(List blackList) {
        this.blackList = blackList;
    }

    public void setApplicationContext(ApplicationContext ctx) {
        this.ctx = ctx;
    }

    public void sendEmail(String address, String text) {
        if (blackList.contains(address)) {
            BlackListEvent evt = new BlackListEvent(address, text);
            ctx.publishEvent(evt);
            return;
        }
        // send email...
    }
}

이제 BlackListEvent를 실제 발생 시키고 화면에 메시지가 출력 되는지 확인해 봐야 합니다. 그럼 먼저 EmailBean을 context에 등록하고 EmailBean의 blackList에 이벤트를 발생시킬 이메일 주소를 넣어줍니다. 그리고 Event를 핸들링할 bean을 설정해 줍니다.

      <bean id="emailBean" class="event.EmailBean" >
          <property name="blackList">
              <list>
                  <value>monster@email.com</value>
              </list>
          </property>
      </bean>

    <bean id="blackListListener" class="event.BlackListNotifier" />

그리고 이벤트가 발생하는지 확인하기 위해서 monster@email.com으로 간단한 메시지를 날려봅니다. 그럼 화면에는 "메일 보내지마~"라고 출력이 될 것입니다.

        EmailBean emailBean = (EmailBean) bf.getBean("emailBean");
        emailBean.sendEmail("monster@email.com", "I'm gonna kill u");