백기선 whiteship2000@gmail.com http://whiteship.tistory.com Advanced bean wiring 백기선 whiteship2000@gmail.com http://whiteship.tistory.com www.springframework.co.kr
Declaring parent and child beans 상속은 다 아시죠? Spring bean 설정에서도 상속이 가능합니다. parent abstract www.springframework.co.kr
Abstracting a base bean type www.springframework.co.kr
Abstracting a base bean type www.springframework.co.kr
소스 코드 보기 test/chapter3/BeanAbstractingTest.java private Instrumentalist kenny; private Instrumentalist david; private Instrumentalist frank; www.springframework.co.kr
Overriding inherited properties 상속 받은 속성을 재정의 할 수 있습니다. www.springframework.co.kr
Abstracting common properties 서로 다른 타입에 존재하는 공통 속성을 추상화 할 수 있을까? www.springframework.co.kr
Abstracting common properties www.springframework.co.kr
소스 코드 보기 test/chapter3/BeanAbstractingTest.java www.springframework.co.kr
Applying method injection www.springframework.co.kr
Applying method injection Method Replacement 런타임 때 기존의 메소드를 다른 구현체로 대체 합니다. Getter Injection 런타임 때 기존의 메소드를 Spring Context에 있는 객체를 반환하는 메소드로 대체 합니다. www.springframework.co.kr
Basic method replacement MethodReplacer 인터페이스 구현. <replaced-method> 엘리먼트 사용 name replacer www.springframework.co.kr
소스 코드 보기 test/chapter3/MethodInejctionTest.java Magician, MagicBox MagicBox.getContext() www.springframework.co.kr
Using getter injection <lookup-method> name bean method replacement로 대체 가능 www.springframework.co.kr
소스 코드 보기 test/chapter3/MethodInejctionTest.java Instrumentalist.perform(); www.springframework.co.kr
Injecting non-Spring beans 모든 객체가 Spring Container에서 만들어 지는 것은 아닙니다. 그럼 그런 객체들은 Spring Container가 관리하지 못하는 건가요? @Configurable <bean> abstract <aop:spring-configured /> www.springframework.co.kr
소스 코드 예제 new 키워드 사용하여 객체 생성하기 속성들이 설정되었는지 확인하기 test/chapter3/ConfigurableTest.java www.springframework.co.kr
Registering custom property editors 속성을 설정할 때 지금까지 모두 “문자열”로 넣었습니다. Spring이 워낙 똑똑해서 기본 타입을 알아서 변환해서 넣어줬습니다. 그런데... Custom Type으로도 Spring이 알아서 변환해 줄 수 있을까요? 없습니다. 개발자가 Spring을 조금 도와줘야 합니다. www.springframework.co.kr
Registering custom property editors PropertyEditorSupport 상속하여 구현 setAsText() getAsText() org.springframework.beans.factory.conf ig.CustomEditorConfigurer 빈으로 등록하기 customEditors 속성 설정 www.springframework.co.kr
소스 코드 보기 Custom Property Editor 사용하지 않을 때의 불편함 사용했을 때의 간편함. test/chapter4/PropertyEditorTest.java www.springframework.co.kr
Working with Spring’s special beans 다른 bean 또는 beanFactory를 조작하는 bean. Property 파일을 읽어 들이는 bean. 국제화 지원과 같이 Property에서 텍스트를 읽어 오는 bean. 다른 bean에서 발생한 이벤트를 대기하거나 처리하는 bean. Container에서의 자신의 식별자를 알고 있는 bean. www.springframework.co.kr
Postprocessing beans bean 초기화 이전 또는 이후에 bean을 조작할 수 있습니다. BeanPostProcessor 인터페이스 구현하기. 구현한 BeanPostProcessor 등록하기. www.springframework.co.kr
소스 코드 보기 Fuddifier test/chapter3/BeanPostProcessorTest.ja va r또는 l을 w로 변환. R또는 L을 W로 변환. test/chapter3/BeanPostProcessorTest.ja va www.springframework.co.kr
Spring이 제공하는 BeanPostProcessor ApplicationContextAwareProcessor DefaultAdvisorAutoProxyCreator www.springframework.co.kr
Postprocessing the bean factory 모든 bean 초기화 전에(BeanPostProcessor도 포함해서) Spring Container를 조작할 수 있습니다. BeanFactoryPostProcessor 인터페이스 구현하기. 구현한 BeanFactoryPostProcessor 등록하기. www.springframework.co.kr
소스 코드 보기 BeanCounter test/chapter3/BeanPostProcessorTest.ja va Spring Container에 등록된 bean의 개수를 세는 BeanFactoryPostProcessor. test/chapter3/BeanPostProcessorTest.ja va 콘솔 창의 로그 메시지 중에 BEAN COUNT: 3 출력. www.springframework.co.kr
Spring이 제공하는 BeanFactoryPostProcessor CustomerEditorConfigurer PropertyPlaceholderConfigurer www.springframework.co.kr
Externalizing configuration properties 설정 내용을 별도의 파일로 빼내는 것이 유용한 경우가 있습니다. 서버나 DB와 같은 환경에 종속적인 데이터. www.springframework.co.kr
Externalizing configuration properties PropertyPlaceholderConfigurer 사용. www.springframework.co.kr
Resolving text messages 화면에 보여줄 메시지를 뷰에 직접 입력하지 않는 것이 좋을 때가 있습니다. 국제화 지원 자주 바뀌는 문구 MessageSource 인터페이스 사용. www.springframework.co.kr
Resolving text messages 프로퍼티 파일 작성 http://decoder.tistory.com/48 ResourceBundleMessageSource 등록하기 bean의 이름을 messageSource로 하면 applicationContext가 자동으로 읽어들임. 사용하기 자바 코드에서는 API 호출 context.getMessage("computer", new Object[0], locale); 뷰에서는 Spring 태그 사용. <spring:message code="computer"/> www.springframework.co.kr
Decoupling with application events 이벤트 핸들러와 이벤트를 발생 시키는 객체들은 서로가 서로를 몰라도 됩니다. www.springframework.co.kr
Decoupling with application events 이벤트 클래스 작성하기. ApplicationEvent 상속하여 구현. 이벤트 발생 시키기. ApplicationContext의 publishEvent() 메소드 사용. 정확하게는 ApplicaionContext 인터페이스가 상속한 EventPublisher 인터페이스의 메소드 입니다. 이벤트 핸들러 작성하기 ApplicationListener 인터페이스 구현. www.springframework.co.kr
Making beans aware BeanNameAware BeanFactoryAware 애플리케이션 내부에 같은 객체가 두 개 이상일 때 각각을 구분하기 위한 식별자로 사용할 수 있습니다. BeanFactoryAware ApplicationContextAware Spring Container를 사용할 필요가 있을 때 구현 합니다. MessageSource 기능이 필요할 때. EventPublisher 기능이 필요할 때. ... www.springframework.co.kr
Scripting beans 자바는 정적인(static) 언어입니다. 실행 도중에 프로그램을 변경할 수 없습니다. 스프링은 스크립트 언어도 POJO로 주입(Injection) 할 수 있습니다. www.springframework.co.kr
Scripting beans example POJO에 Script를 주입하기. POJO 구현하기 POJO가 사용할 Script의 인터페이스 구현하기 Spring Context에 등록하기 Coconut Lime www.springframework.co.kr
스크립트 주입하기 1. lang 네임스페이스 추가하기. www.springframework.co.kr
스크립트 주입하기 2. Ruby, Groovy, BeanShell 파일 작성하기 lang 엘리먼트로 등록하기. 필요한 라이브러리 추가하기. jruby.jar groovy-1.0.jar bsh-2.0b4.jar asm-2.2.3.jar antlr-2.8.6.jar backport-util-concurrent.jar(lib/concurrent/ 위치함) www.springframework.co.kr
스크립트 속성 주입하기 <lang:property> 엘리먼트 사용하기. name ref JRuby를 Groovy에 주입하고, 그것을 다시 BeanShell에 주입하는 것이 가능합니다. getBean()으로 원하는 스크립트 객체를 자바 애플리케이션에서 사용할 수 있습니다. www.springframework.co.kr
스크립트 리로딩 시간 설정하기 lang 엘리먼트의 refresh-check-delay 속성에 밀리초로 설정 예) 5초 마다 리프래쉬 하기 refresh-check-delay=“5000” www.springframework.co.kr
설정 파일에서 스크립트 정의하기 <![CDATA[…]]> 와 ]]> 사이에 스크립트 정의하기. XML이 위의 태그 안에 있는 코드를 파싱하는 것을 방지하기 위한 것입니다. www.springframework.co.kr
Summary Bean 설정 추상화하기 Method Injection Spring Container 밖에서 생성한 객체 설정하기 ApplicationContext의 기능 PropertyEditor MessageResolver EventPublisher 스크립트 언어 사용하기 www.springframework.co.kr
발표에 대한 질문 또는 피드백 www.springframework.co.kr
감사합니다. www.springframework.co.kr