Spring Bean생성 XML, Annotation예제
- 프로그래밍/Spring FWK
- 2015. 12. 13. 17:36
초기에 작성했던 간단한 예제 Spring HelloWorld를 xml기반 설정과 annotation기반 설정으로 비교한 소스코드 이다. Annoation방식은 XML방식의 <bean>태그를 사용하지 않고 @Service("beanId")를 지정한 class를 자동으로 bean으로 등록하여 준다. 어떤 방법을 쓰더라도 Bean을 가져오는 방식에는 영향이 없다.
ApplcationCtxXml Project
- xml을 이용한 Bean정의
- lookup방식으로 Bean획득
- 이전예졔 예제와 거의 유사 함. (본 예제는 setter injection을 사용하지 않음)
[interface IMessageProvider]
1 2 3 4 5 | package com.ljs.message.provider; public interface IMessageProvider { public String getMessage(); } | cs |
[class DefaultMessageProvider]
1 2 3 4 5 6 7 8 9 10 | package com.ljs.message.provider; public class DefaultMessageProvider implements IMessageProvider { @Override public String getMessage() { return "Hell World!"; } } | cs |
[interface IMessageRender]
1 2 3 4 5 6 7 8 9 | package com.ljs.message.render; import com.ljs.message.provider.IMessageProvider; public interface IMessageRender { public void render(); public void setMessageProvider(IMessageProvider provider); public IMessageProvider getMessageProvider(); } | cs |
[class DefaultMessageRender]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.ljs.message.render; import com.ljs.message.provider.IMessageProvider; public class DefaultMessageRender implements IMessageRender { private IMessageProvider messageProvider; @Override public void render() { if(messageProvider==null) { throw new RuntimeException("messageProvider can't be null"); } else { System.out.print(messageProvider.getMessage()); } } @Override public void setMessageProvider(IMessageProvider provider) { this.messageProvider = provider; } @Override public IMessageProvider getMessageProvider() { return messageProvider; } } | cs |
[Main Class]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.ljs.message; import org.springframework.context.support.GenericXmlApplicationContext; import com.ljs.message.provider.IMessageProvider; import com.ljs.message.render.IMessageRender; public class AppCtxTestMain { public static void main(String[] args) { // ApplicationContext 부트스트랩 GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("classpath:META-INF/spring/app-context-annotation.xml"); // ApplicationContext로 부터 bean 획득 IMessageRender render = (IMessageRender) ctx.getBean("messageRender"); IMessageProvider provider = (IMessageProvider) ctx.getBean("messageProvider"); render.setMessageProvider(provider); render.render(); } } | cs |
[application-context-xml.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans <!-- ApplicationContext에서 관리 할 bean 정의 --> <bean id="messageProvider" name="" class= "com.ljs.message.provider.DefaultMessageProvider"/> <bean id="messageRender" name="" class= "com.ljs.message.render.DefaultMessageRender"/> </beans> | cs |
ApplcationCtxAnnotation Project
- Annotation을 이용한 Bean정의 (추가 Bean이 정의되어도 @Service만 붙여주면 별도의 xml파일 수정 필요없다)
- lookup방식으로 Bean획득
- interface, main class는 xml방식과 동일
- bean으로 관리될 class파일에 annotaiton이 붙고, xml 파일설정만 다르다.
[interface IMessageProvider]
- 상동
[class DefaultMessageProvider]
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.ljs.message.provider; import org.springframework.stereotype.Service; @Service("messageProvider") public class DefaultMessageProvider implements IMessageProvider { @Override public String getMessage() { return "Hell World!"; } } | cs |
[interface IMessageRender]
- 상동
[class DefaultMessageRender]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package com.ljs.message.render; import org.springframework.stereotype.Service; import com.ljs.message.provider.IMessageProvider; @Service("messageRender") public class DefaultMessageRender implements IMessageRender { private IMessageProvider messageProvider; @Override public void render() { if(messageProvider==null) { throw new RuntimeException("messageProvider can't be null"); } else { System.out.print(messageProvider.getMessage()); } } @Override public void setMessageProvider(IMessageProvider provider) { this.messageProvider = provider; } @Override public IMessageProvider getMessageProvider() { return messageProvider; } } | cs |
[Main Class]
- 상동
[application-context-annotation.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans <!--스프링이 코드기반에서 의존성 요구조건을 스캔하게끔 세팅--> <context:annotation-config/> <!--스프링이 코드에서 지정된 패키지(및 하위)아래에 있는 주입 가능한 빈을 모두 스캔하도록 세팅--> <context:component-scan base-package="com.ljs.message"/> </beans> | cs |
* 추가설명
1 2 3 | <context:component-scan base-package="com.ljs.appctxexample"/> <context:exclude-filter type="assignable" expression="com.ljs.NotAService"/> </context:component-scan> | cs |
위와 같은 방식으로 context:component-scan 태그에 특정 클래스는 주입대상 클래스에서 제외할 수 있다.
type=annotation, regex, assignable, AspectJ, custom을 조건으로, expression의 형식은 type에 따라 다르다.
annotation방식은 소스코드 Class정의에 @Service("beanId") 를 추가하여 xml설정방식의<bean> 태그를 대신하고 있다.
대신, annotation방식을 이용할 경우 위와 같이 <context:component-scan>태그를 추가하여 주어야 한다.
@Service("beanId") Annotation부분이 추가된 것. xml설정이 달라지는 것을 제외하고 interface, main 소스코드는 전부 동일하다.
다운로드
'프로그래밍 > Spring FWK' 카테고리의 다른 글
Spring SpEL을 이용하여 Value세팅하기 (0) | 2015.12.13 |
---|---|
Spring Constructor DI (value 주입) (0) | 2015.12.13 |
Spring Constructor DI (ref bean주입) (0) | 2015.12.13 |
Spring Setter DI (0) | 2015.12.13 |
IoC in Spring : ApplicationContext (0) | 2015.12.13 |
IoC in Spring : BeanFactory (0) | 2015.12.13 |
Spring IoC (0) | 2015.12.13 |
Spring DI가 적용된 HelloWorld (0) | 2015.12.13 |
이 글을 공유하기