Whiteship's Note


Resource, ResourceLoader 인터페이스 사용 예

Spring/Chapter 4 : 2007.03.21 01:18


간단한 테스트 코드를 작성해 봤습니다.

@Test public void resource(){
        Resource resource = context.getResource("resourceTest.txt");
        assertTrue(resource.exists());
    }

ApplicationContext를 ResourceLoader로 사용할 수도 있기 때문에 getResource를 통해서 Resource객체를 받을 수 있습니다.

사용자 삽입 이미지
resourceTest.txt 파일의 위치가 위 와 같을 때.. 위의 테스트 코드는 빨간불이 들어옵니다. 대시 file: 이라는 prefix를 붙여 주면 녹색 불이 들어옵니다.

    @Test public void resource(){
        Resource resource = context.getResource("file:resourceTest.txt");
        assertTrue(resource.exists());
    }


getResource의 인자로 넘기는 문자열 값에 붙일 수 있는 prefix에는 다음과 같은 것들이 있습니다.

PrefixExampleExplanation

classpath:

classpath:com/myapp/config.xml

Loaded from the classpath.

file:

file:/data/config.xml

Loaded as a URL, from the filesystem. [a]

http:

http://myserver/logo.png

Loaded as a URL.

(none)

/data/config.xml

Depends on the underlying ApplicationContext.


아무것도 안붙인 상태에서 에러가 발생한 이유는 현재 사용중인 ApplicationContext가 ClassPathXmlApplicationContext 이녀석이기 때문에 classpath: 를 붙인 것 처럼 동작했기 때문입니다.

top


ApplicationEvent 사용 예

Spring/Chapter 3 : 2007.03.16 18:53


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");

top


3.8. The ApplicationContext

Spring/Chapter 3 : 2007.03.14 16:27


사용자 삽입 이미지

3.8.1. Internationalization using MessageSources

MessageSource 인터페이스
를 상속하고 있기 때문에 다음의 메소드들을 사용하여 Message를 받아 올 수 있습니다.

ApplicationContext가 로딩 될 때 context에 정의되어 있는 MessageSource를 자동으로 읽어 들입니다. 이때 bean의 이름은 messageSource 여야 합니다.

MessageSource 인터페이스 (2)
MessageSource 사용 예

3.8.2. Events

ApplicationEvent 클래스ApplicationListener 인터페이스를 사용해서 ApplicationContext에서 이벤트 처리를 지원합니다.

ApplicationEvent 사용 예

3.8.3. Convenient access to low-level resources

4장 Resources에서 자세히 다룰 예정이오니 pass.

3.8.4. Convenient ApplicationContext instantiation for web applications

ContextLoader를 사용해서 웹 어플리케이션에서 ApplicationContext를 선언적으로 생성할 수 있다.

일반적으로 ContexLoader를 구현한 ContextLoaderListenerContextLoaderServlet를 다음과 같이 사용합니다. Servlet 2.2 나 2.3 에서는 ContextLoderServlet을 사용해야 합니다.

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- or use the ContextLoaderServlet instead of the above listener
<servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
-->

top


BeanFactory와 ApplicationContext 인터페이스

Spring/Chapter 3 : 2007.03.05 12:59


사용자 삽입 이미지
IoC의 가장 상위에 있는 인터페이스인 BeanFactory에 있는 메소드들 입니다.

사용자 삽입 이미지
ApplicationContext 인터페이스에 있는 메소드 들인데 이 인터페이스는 아래의 인터페이스를 확장하고 있습니다.
ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
확대
위 인터페이스들의 클래스 다이어그램을 그려보면 다음과 같이 됩니다.

사용자 삽입 이미지

BeanFactory를 구현한 클래스들(ApplicationContext를 구현한 클래스와 중복되는 클래스는 삭제했습니다.)
AbstractBeanFactory, DefaultListableBeanFactory, StaticListableBeanFactory, XmlBeanFactory,
ApplicationContext를 구현한 클래스들
AbstractApplicationContext, AbstractRefreshableApplicationContext, AbstractRefreshablePortletApplicationContext, AbstractRefreshableWebApplicationContext, AbstractXmlApplicationContext, ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, GenericApplicationContext, GenericWebApplicationContext, StaticApplicationContext, StaticPortletApplicationContext, StaticWebApplicationContext, XmlPortletApplicationContext, XmlWebApplicationContext
이 많은 IoC container들 중에 언제 어떤 걸 써야 할런지....;;;;

참조 : BeanFactory 이해

'Spring > Chapter 3' 카테고리의 다른 글

idref 엘리먼트  (0) 2007.03.08
Constructor Injection 할 때 인자 구분  (0) 2007.03.08
Setter Injection & Constructor Injection  (0) 2007.03.08
3.3. Dependencies  (0) 2007.03.08
Bean 생성하기  (0) 2007.03.07
복잡한 Alias  (0) 2007.03.07
Aliasing Beans  (0) 2007.03.07
id, name and BeanDefinitionName  (0) 2007.03.06
FileSystemResource vs ClassPathResource  (2) 2007.03.06
3.2. Basics - containers and beans  (0) 2007.03.05
BeanFactory와 ApplicationContext 인터페이스  (0) 2007.03.05
top