1 / 35

Spring 2.5 programming - Spring DI(Dependency Injection)

Spring 2.5 programming - Spring DI(Dependency Injection). 2009.07.21 Naver 지식 iN 서비스개발팀 임수민. 목차. Spring container Bean setup Constructor method Property method Auto-wire Life cycle External setup property Message globalization Event Annotation-based setup Component Scan.

luigi
Download Presentation

Spring 2.5 programming - Spring DI(Dependency Injection)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Spring 2.5 programming - Spring DI(Dependency Injection) 2009.07.21 Naver지식iN서비스개발팀 임수민

  2. 목차 • Spring container • Bean setup • Constructor method • Property method • Auto-wire • Life cycle • External setup property • Message globalization • Event • Annotation-based setup • Component Scan

  3. Spring Container 빈 객체 저장 각 객체 간의 의존관계를 관리 1

  4. Spring Container DI 제거 1

  5. Spring Container (cont’d) Bean Factory Interface Org.springframework.beans.factory.BeanFactory 인터페이스 • 빈 객체를 관리하고 의존관계 설정해주는 기능을 제공하는 가장 단순한 컨테이너 • XmlBeansFactory가 구현클래스로 쓰임 • Ex) 특정파일로부터 설정파일을 읽어오는 XmlBeanFactory 객체 생성, 빈 사용 1 Resource resource = new FileSystemResource(“beans.xml”); XmlBeanFactory factory = new XmlBeanFactory(resource); ParserFactory factory = (ParserFactory)factory.getBean(“parserFactory”);

  6. Spring Container (cont’d) ApplicationContext & WebApplicationContext interface org.springframework.context.ApplicationContext Interface • BeanFactory 인터페이스 상속받은 인터페이스 • 다양한 추가기능을 가지고 있어 가장 많이 쓰임 • 웹 어플리케이션 당 한 개의 Web ApplicationContext 존재 org.springframework.context.support.ClassPathXmlApplicationContext • 클래스 패스에 위치한 XML 파일로부터 설정 정보 로딩 String configLocation = “config/applicationContext.xml” ApplicationContext context = new ClassPathXmlApplicationContext(configLocation); org.springframework.context..support.FileSystemXmlApplicationContext org.springframework.context.support.XmlWebApplicationContext 1

  7. Spring Container (cont’d) ApplicationContext & WebApplicationContext interface (cont’d) web.xml 파일에서 다음과 같이 리스터 등록 <context-param> <param-name> contextConfigLocation</param-name> <param-value> WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> 1

  8. Spring Container (cont’d) XML스키마를 이용한 스프링 설정 <?xml version=“1.0” encoding=“UTF-8”?> <beans xmlns=“http://www.springframework.org/schema/beans” xmlns:x냐=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation = “http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd”> </beans> .jar 파일에 포함된 파일을 내부적으로 처리하기 때문에 XML이나 DTD 스키마 파일에 URL을 올바르게 입력하면 인터넷 연결 상관없이 설정 파일 로딩 가능 1

  9. Bean Setup 빈(bean)생성과 의존 관계 설정 빈 생성 및 사용 2 생성할 빈 객체의 클래스 이름 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id=“articleDao" class=“kame.spring.chap02.MysqlArticleDao" > <property name=“mysqlArticleDAO" ref=“mysqlDAO" /> </bean> </beans> Resource resource = new ClassPathResource(“applicationContext.xml”); BeanFactory beanFactory = new XmlBeanFactory(resource); MysqlArticleDao articleDao = (MysqlArticleDao)beanFactory.getBean(“articleDao”);

  10. Bean Setup 빈(bean)생성과 의존 관계 설정 (cont’d) MysqlArticleDao 클래스 public class MysqlArticleDao implements ArticleDao{ //파라미터를 갖는 생성자가 정의되어있는 경우, 기본 생성자 추가 public MysqlArticleDao(){ } public MysqlArticleDao (DataSource dataSource){ …. } } 빈 팩토리 매서드 public class ParserFactory{ private static ParserFactory instance = new ParserFactory(); public static ParserFactory getInstance() { return instance; } private ParserFactory() { } } 2

  11. Bean Setup 빈(bean)생성과 의존 관계 설정 (cont’d) • 직접설정하여 스프링 컨테이너는 생성자를 사용하지 않고 ParserFactory 클래스 객체를 구함 <bean id = “parserFactory” class=“kame.spring.chap02.ParserFactory” factory-method = “getInstance” /> 2

  12. Bean Setup 의존 관계 설정 방식 4가지 생성자 방식 프로퍼티 설정 방식 XML 네임스페이스를 이용한 프로퍼티 설정 임의 빈 객체 전달 2

  13. Bean Setup 생성자 방식 <constructor-arg> 태그를 이용하여 의존하는 객체를 전달 • - xml 설정 & -java 설정 2 <bean id="testService" class="...TestServiceSpring"> <constructor-arg> <ref bean="testDao"/> </constructor-arg> or <constructor-arg ref="testDao"/> </bean> <bean id="testDao" class="...SqlMapTestDao"/> //JAVA에서 public class TestServiceSpring { private TestDao testDao; public TestServiceSpring(TestDao testDao) { this.testDao = testDao; } ...

  14. Bean Setup (cont’d) 프로퍼티 설정 방식 setXXX() 형태의 설정 메소드를 통해서 필요한 객체와 값을 전달받음 XML 설정 <bean name="testService" class="...TestServiceSpring"> <property name="testDao" ref="testDao"/> </bean> 자바 소스 public class TestServiceSpring implements TestService { private TestDao testDao; public void setTestDao(TestDao testDao) { this.testDao = testDao; } ... } 2

  15. Bean Setup (cont’d) XML 네임스페이스를 이용한 프로퍼티 설정 <property> 태그가 아닌 XML 네임스페이스를 이용하여 설정 • 네임스페이스가 http://www.springframework.org/schema/p 인 접두어를 사용 • 기본 데이터 타입 ("p:프로퍼티이름" 속성) 으로 프로퍼티 값 설정 • 빈 객체를 프로퍼티에 전달 ("p:프로퍼티이름-ref" 속성) - xml 설정 <beans xmlns="http://www.springframework.org/schema/beans" xmllns="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="" class="" p:periodTime="10" p:sender-ref="smsSender"/> </beans> 2

  16. Bean Setup (cont’d) 임의 빈 객체 전달 식별 값을 갖지 않는 빈 객체를 생성하여 전달 • 식별 값을 갖지 않기 때문에, 임의 빈 객체는 재사용 불가 • <bean> 태그에 id나 name 속성을 사용하여 식별 값을 주어도 해당 식별 값은 사용 불가 <bean id="" class=""> <property name="test"> <!-- 임의 빈 객체 --> <bean class="...TestDao"> <constructor-arg value="true"/> </bean> </property> </bean> 2

  17. Bean Setup (cont’d) Auto-wire 스프링은 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정 가능 • byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정 • byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정 • constructor : 생성자 파리미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달 • autodetect : constructor 방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정 디버깅이 어려운 단점 2

  18. Life Cycle (cont’d) 스프링 컨테이너에 저장되는 빈 객체는 최소한 생성, 초기화, 소멸의 라이프 사이클을 갖게 됨 생성, 초기화, 소멸뿐만 아니라 추가적인 단계를 통해 라이프 사이클에 따른 빈 객체의 상태를 정교하게 제어 가능 3

  19. Life Cycle (cont’d) [인터페이스.메서드이름]으로 표시된 단계는 빈 클래스가 지정한 인터페이스를 구현했을 경우 스프링 컨테이너가 지정한 메서드를 호출 • ex) BeanNameAware.setBeanName() 는 빈 클래스가 BeanNameAware 인터페이스를 구현했을 경우 setBeanName() 메서드가 호출된다는 것을 의미 커스텀 init-method 는<bean> 태그의 init-method 속성에서 지정한 메서드가 호출 커스텀 destroy-method는 <bean> 태그의 destroy-method 속성에서 지정한 메서드가 호출 스프링은 빈 객체를 생성하고, <property> 태그에 명시된 프로퍼티의 값을 설정한 뒤 빈 클래스가 구현한 인터페이스에 따라 위 그림에 명시한 순서대로 메서드를 호출 생성이 완료되면 BeanFactory.getBean() 메서드를 이용하여 빈 객체를 사용할 수 있음 3

  20. Life Cycle (cont’d) 3 • ApplicationContext를 이용할 경우 BeanFactory의 라이프 사이클과 비교하여 몇 가지 단계가 추가 • 자원 및 이벤트 처리, 이벤트 처리 등 추가적인 기능 제공

  21. Event ApplicationContext는 publishEvent()를 이용하여 객체를 전달 받을 수 있게 함 • ContextRefreshEvent • ContextCloseEvent • ContextStartedEvent(2.5) • ContextStoppedEvet(2.5) 6

  22. Annotation-based Setup @Required • 필수 프로퍼티 검사, 인식은 스프링 설정파일과 함께 해야 어노테이션 인식함 @Autowired • 의존관계를 자동으로 설정 (멤버 필드에도 적용 가능) @Qualifier • 자동 설정 제한, 자동 연결될 빈 객체의 수식어를 값Qualifier(“main”)으로 가짐 @Resource • 의존하는 빈 객체 전달시 사용 • 네임 속성 사용 @PostConstruct & @PreDestory • 라이프 사이클의 초기화 및 제거 과정 시작,끝 점 위 어노테이션들은 특정 클래스에 설정 태그로 빈 객체를 등록해줘야 함 7

  23. Annotation-based Setup (cont’d) @Autowired 어노테이션을 이용한 자동 설정 • 생성자, 필드, 메서드 세곳에 적용 가능 • 프로퍼티 자동 설정 기능 제공 • Sender프로퍼티에 MessageSender타입의 빈 객체를 전달 public class SystemMonitor{ ... @Autowired public void setSender(MessageSender sender){ this.sender = sender; } } ------------------------------------------------- <bean class=“org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPstProcessor”/> <- 스프링 설정파일에 빈 객체로 등록하면 자동설정 적용됨 7

  24. Component Scan 클래스 패스에 위치한 클래스를 검색 특정한 어노테이션이 기재된 클래스를 자동으로 빈으로 등록 XML 설정 없이 특정 클래스를 빈으로 등록 가능 @Repository @Component @Service @Controller 8 ApplicationContext context = …; SystemMonitor monitor = (SystemMonitor)context.getBean(“systemMonitor”); ---------- @Component(“monitor”) public class SystemMonitor {…}

  25. Component Scan 스캔대상 범위 지정 • 필터 태그 사용 • <context:include-filter> • <context:exclude-filter> 8 • <context:component-scan base-package=“kame.spring.chap02.scan”> • <context:include-filter type=“regex” expression=“*HibernateRepository”/> • </context:component-scan>

  26. Component Scan Annotation 속성 • 클래스에 지정한 어노테이션이 적용되었는지의 여부. Expression 속성에는 “org.example.SomeAnnotation”와 같이 어노테이션 이름을 입력 Assignable 속성 • 클래스가 지정한 타입으로 할당 가능 여부, expression속성에는 org.example.SomeClass 와 같ㄷ이 타입 이름을 입력 Regex 속성 • 클래스 이름이 정규 표현식에 매칭되는지의 여부. Expression 속성에는 org\.example\.Default.*와 같이 정규 표현식을 입력 Aspectj 속성 8

  27. Spring Container DI 제거 ex

  28. 8

  29. Thank you 본 컨텐츠는 NHN의 재산이므로 사전 동의 없는 도용이나 사용을 금합니다

More Related