Spring 의 용기 이벤트 시스템 에 대해 말씀 드 리 겠 습 니 다.

8478 단어 Spring
Spring 의 applicationContext 는 이 벤트 를 발표 할 수 있 고 해당 이벤트 감청 기 를 등록 할 수 있 으 며 완벽 한 이벤트 발표 와 감청 체 제 를 가지 고 있 습 니 다.
이벤트 시스템 에서 이러한 개념 이 있 습 니 다. * 이벤트: java. util. EventObject. *모니터: java. util. EventListener. *이벤트 원본: 이벤트 가 발생 하면 모든 이벤트 가 하나의 이벤트 원본 을 가 져 야 합 니 다. *이벤트 감청 기 등록 표: 감청 기 를 저장 하 는 데 사 용 됩 니 다.이벤트 원본 에 이벤트 가 발생 하면 레 지 스 트 에 있 는 모니터 에 알려 줍 니 다. *이벤트 방송 기: 모니터 에 사건 을 알 리 는 일 을 맡 습 니 다.
때때로 이벤트 원본, 감청 기 등록 표 와 이벤트 방송 이라는 세 가지 역할 은 같은 대상 이 맡 을 수 있다. 예 를 들 어 java. swing 의 JButton 이다.
사건 체 계 는 사실 관찰자 모델 의 구체 적 인 실현 방식 이다.
1 Spring 이벤트 클래스 시스템
1.1 이벤트 클래스
ApplicationEvent 의 유일한 구조 함 수 는 ApplicationEvent(Object source) 입 니 다. source 를 통 해 이벤트 소스 를 지정 합 니 다. 두 가지 키 종류 가 있 습 니 다. * ApplicationContextEvent - 용기 사건 은 네 가지 키 종류 가 있 는데 각각 정지, 새로 고침, 닫 기, 시작 용기 사건 을 표시 합 니 다. *RequestHandled Event - 웹 응용 프로그램 과 관련 된 이벤트 입 니 다. HTTP 요청 을 처리 하면 이 이벤트 가 발생 합 니 다. (전 제 는 웹. xml 에서 Dispatcher Servlet 을 정의 합 니 다.)
1.2 이벤트 모니터 인터페이스
응용 프로그램 Listener 인 터 페 이 스 는 onApplicationEvent(E event) 방법 만 정의 합 니 다. 응용 프로그램 이벤트 대상 을 받 아들 이 고 이 이벤트 의 응답 처리 논 리 를 실현 합 니 다.
SmartApplication Listener 는 Spring 3.0 에 추 가 된 인터페이스 로 두 가지 방법 을 정의 합 니 다.
방법.
설명 하 다.
boolean supportsEventType(Class eventType)
어떤 종류의 용기 이 벤트 를 지원 할 지 지정 합 니 다.
boolean supportsSourceType(Class sourceType)
어떤 데이터 원본 에 응답 할 지 지정 합 니 다.
GenericApplicationListener 는 Spring 4.2 에 추 가 된 인터페이스 로 일반적인 지원 을 강화 합 니 다. 슈퍼 portsEventType () 방법의 매개 변 수 는 분석 가능 한 형식 ResolvableType 을 사용 합 니 다.이것 은 Spring 4 가 제공 하 는 일반적인 조작 지원 류 로 이 를 통 해 일반적인 실제 유형 정 보 를 쉽게 얻 을 수 있 습 니 다. 예 를 들 어 클래스, 필드 급 등 일반적인 정 보 를 얻 을 수 있 습 니 다.Spring 4 의 프레임 워 크 에서 많은 핵심 류 내부 와 관련 된 일반적인 작업 은 대부분 Resolvable Type 류 를 사용 하여 처리 합 니 다.
GenericApplicationListener 는 SmartApplicationListener 의 방법 기능 과 같은 두 가지 방법 을 정의 합 니 다.
1.3 이벤트 방송 기
Spring 은 이벤트 방송 기 에 인터페이스, 추상 류 와 간단 한 실현 류 를 정의 했다.
2 분석
응용 프로그램 Context 인터페이스의 추상 적 인 실현 류 Abstract 응용 프로그램 Context 는 이벤트 체 계 를 구축 했다.응용 프로그램 Event Multicaster 변 수 를 포함 합 니 다. 이 변 수 는 용기 모니터 의 레 지 스 트 를 제공 합 니 다.그리고 refresh () 는 다음 절 차 를 통 해 사건 의 인 프 라 를 구축 했다.
  • 상하 문 을 응용 하 는 이벤트 방송 기 초기 화 - initApplicationEventMulticaster();
  • 등록 사건 모니터 - registerListeners()
  • 용기 리 셋 이벤트 발표 - finishRefresh()
  • 설정 파일 에서 용기 의 이벤트 방송 기 를 사용자 정의 할 수 있 습 니 다.Spring 에서 정 의 된 이벤트 방송 기 를 찾 지 못 하면 기본 이벤트 방송 기 (Simple ApplicationEventMulticaster) 를 사용 합 니 다.
    Spring 은 반사 체 제 를 이용 하여 Bean Definition Registry 에서 ApplicationListener 를 실현 한 Bean 을 모두 찾 아 용기 로 등록 한 이벤트 모니터 를 찾 습 니 다.
    3. 예시
    만약 에 우리 가 문자 발송 기 가 필요 하 다 고 가정 하면 목적 번호 에 문 자 를 보 낼 때 사건 이 발생 한 다음 에 이 사건 을 등록 한 모니터 에 알 리 고 후속 적 인 업무 논리 작업 을 한다.
    SmsSendEvent 이벤트:
    public class SmsSendEvent extends ApplicationContextEvent {
    
        /**
         *     
         */
        private String target;
    
        /**
         * Create a new ContextStartedEvent.
         *
         * @param source the {@code ApplicationContext} that the event is raised for
         *               (must not be {@code null})
         * @param target
         */
        public SmsSendEvent(ApplicationContext source, String target) {
            super(source);
            this.target = target;
        }
    
        public String getTarget() {
            return target;
        }
    }

    SmssendEvent 는 applicationContextEvent 를 확장 하여 목적 번호 target 을 추가 하 였 습 니 다.
    SmssendListener 감청 기 는 SmssendEvent 이 벤트 를 감청 합 니 다:
    public class SmsSendListener implements ApplicationListener<SmsSendEvent> {
        public void onApplicationEvent(SmsSendEvent event) {
            System.out.println("  "+event.getTarget()+"     ");
        }
    }

    Smssender 는 applicationContextAware 인 터 페 이 스 를 실현 하여 이 벤트 를 발표 하 는 능력 을 가지 게 되 었 습 니 다.
    public class SmsSender implements ApplicationContextAware {
    
        private ApplicationContext context;
    
        /**
         *      ,      
         *
         * @param applicationContext
         * @throws BeansException
         */
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.context = applicationContext;
        }
    
        /**
         *     
         * @param target
         */
        public void send(String target) {
            System.out.println("      ");
            SmsSendEvent event = new SmsSendEvent(context, target);
            context.publishEvent(event);//                     
        }
    }

    애플 리 케 이 션 Context 대상 을 통 해 이 벤트 를 보 내 고 해당 이벤트 모니터 에 알 립 니 다.
    bean 설정:
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    
        
        <bean class="net.deniro.spring4.event.SmsSendListener"/>
    
        <bean id="SmsSender" class="net.deniro.spring4.event.SmsSender"/>
    
    beans>

    유닛 테스트:
    ApplicationContext context;
    
    @BeforeMethod
    public void setUp() throws Exception {
        context = new ClassPathXmlApplicationContext("beans.xml");
    }
    
    @Test
    public void test() {
        SmsSender sender= (SmsSender) context.getBean("SmsSender");
        sender.send("1892929xxxx");
    }

    용기 가 시작 되면 설정 파일 에 따라 Smssend Listener 모니터 를 자동 으로 등록 합 니 다.
    출력 결과:
    문자 보 내 려 고 합 니 다. 1892929xxxx 에 문자 보 내 려 고 합 니 다.

    좋은 웹페이지 즐겨찾기