Spring Bean생성 XML, Annotation예제

초기에 작성했던 간단한 예제 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"?>
 
    <!-- 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"?>
    
    
    <!--스프링이 코드기반에서 의존성 요구조건을 스캔하게끔 세팅-->    
    <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

이 글을 공유하기

댓글

Email by JB FACTORY