태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


2. 스프링 DI (빈 생성과 의존 관계 설정)  스프링 2.5 / = Study = 

2010.05.11. 17:45

복사http://blog.naver.com/chocolleto/30085911267

번역하기 전용뷰어 보기

2. 빈(Bean) 생성과 의존 관계 설정

  □ 빈 생성 및 사용
    ■ <bean>태그를 이용하여 생성할 빈 객체에 대한 정보 설정.
      ○ <bean> 태그
        - 스프링 컨테이너가 관리할 빈 객체를 생성.
 <?xml version="1.0" encoding="UTF-8"?>

 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="articleDao" class="kame.spring.chap02.MysqlArticleDao">
    </bean>

 </beans>
      ○ <bean> 태그 속성
        - class : 생성할 빈 객체의 완전한 클래스 이름.
        - id : 스프링 컨테이너에서 생성된 객체를 구분하는데 사용되는 식별값. (name 속성을 사용해도 됨.)
    ■ 컨테이너로부터 빈 객체를 가져와 사용
 Resource resource = new ClassPathResource("applicationContext.xml");
 // 스프링 컨테이너 생성
 BeanFactory beanFactory = new XmlBeanFactory(resource);
 // 스프링 컨테이너로부터 빈 객체를 가져와 사용
 MysqlArticleDao articleDao = (MysqlArticleDao)beanFactory.getBean("articleDao");
      - 식별값(id속성 또는 name 속성)을 getBean() 메서드에 전달해서 컨테이너로부터 객체를 가져올 수 있음.
    ■ 주의 사항
      - <bean> 태그에 생성자와 관련된 정보(<constructor-arg>태그)를 명시하지 않았다면, 스프링은 파라미터가 없는 기본 생성자를
         이용하여 객체를 생성.
      - 빈으로 사용할 클래스에 파라미터를 갖는 생성자를 정의했다면 기본 생성자도 함께 정의.
 public class MysqlArticleDao implements ArticleDao {
    // 파라미터를 갖는 생성자가 정의되어 있는 경우, 기본 생성자 추가해야 함.
    public MysqlArticleDao() {}

    public MysqlArticleDao(DataSource dataSource) {
        .......
    }
 }
    ■ 빈 팩토리 메서드
      ○ 생성자가 아닌 static 메서드를 이용하여 객체를 생성해야 하는 경우.
 // 싱글톤 패턴이 적용된 클래스.
 public class ParserFactory {
    private static ParserFactory instance = new ParserFactory();

    public static ParserFactory getInstance() {
        return instance;
    }

    // 기본 생성자 접근 막음.
    private ParserFactory() {}
    .......
 }
      ○ <bean> 태그에 factory-method 속성값으로 static 메서드를 지정
        - 해당 메서드를 이용하여 빈을 생성하도록 설정.
 <bean id="parserFactory" class="kame.spring.chap02.ParserFactory"
    factory-method="getInstance" />
        - factory-method 속성을 지정하면 스프링 컨테이너는 생성자를 사용하지 않고 getInstance()메서드를 이용하여 ParserFactory
          클래스의 객체를 구함.

  □ 의존 관계 설정
    - 스프링 컨테이너에서 각 객체 간의 의존 관계도 XML 파일을 통해 명시 가능.
    ■ 생성자 방식
      - 의존하는 객체를 생성자를 통해 전달 받음.
      ○ 의존 관계
        - WriteArticleServiceImpl 클래스는 ArticleDao 인터페이스에 의존.
      ○ 생성자를 통해 의존하는 객체 전달 받기
 public class WriteArticleServiceImpl {
    private ArticleDao articleDao;

    public WriteArticleServiceImpl(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }

    public void write(Article article) {
        ...
        articleDao.insert(article);
    }
 }
      ○ <constructor-arg> 태그
        ● 특징
          - 생성자를 통해서 의존하는 객체를 전달 받는 경우, <constructor-arg> 태그를 이용하여 의존하는 객체를 전달 할 수 있음.
          - 스프링은 <constructor-arg> 태그를 통해 전달된 값의 타입과 가장 근접한 파라미터를 갖는 생성자를 이용하여 객체를 생성.
        ● <constructor-arg> 태그를 이용한 생성자 방식의 설정
 <!-- WriteArticleServiceImpl 클래스의 생성자에 식별값이 "articleDao"인 빈 객체를 전달.-->
 <bean id="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpel">
    <constructor-arg>
        <ref bean="articleDao">
    </constuctor-arg>
 </bean>

 <bean id="articleDao" calss="kame.spring.chap02.OracleArticleDao">
 </bean>
 // 코드로 표현
 OracleArticleDao articleDao = new OracleArticleDao();
 WriteArticleServiceImpl writeArticleService = new WriteArticleServiceImpl(articleDao);
         - <ref> 태그는 레퍼런스(reference)를 의미.
         - <ref> 태그 대신에 <constructor-arg> 태그의 ref 속성을 사용하여 지정 가능.
 <bean id="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpel">
    <constructor-arg ref="articleDao" />
 </bean>
        ● 생성자가 전달받는 값이 기본데이터 타입이나 String 타입일 경우
          - <ref> 태그 대신에 <value> 태그를 사용하여 값을 지정.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg>
        <value>10</value>
    </constructor-arg>
 </bean>
         - <value> 태그 대신에 <constructor-arg> 태그의 value속성을 사용하여 지정 가능.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg value="10" />
 </bean>
        ● 생성자가 전달받는 파라미터가 2개 이상인 경우
          - 파라미터 개수 만큼 <constructor-arg> 태그 설정.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg value="10" />
    <constructor-arg ref="sender" />
 </bean>
      ○ 예제
        - 두 개의 생성자를 갖는 클래스 설정.
        ● 두 개의 생성자를 갖는 클래스
 public class JobExecutor {
    pubilc JobExecutor(Runnable run) {
        ....
    }

    public JobExecutor(Job job) {
        ....
    }
 }
        ● Job 클래스
          - Runnalbe 인터페이스를 상속받은 인터페이스.
 public interface Job extends Runnable {
    ....
 }
        ● SomeRunnable 클래스
          - Runable 인터페이스를 구현한 클래스.
 public class SomeRunnable implements Runnable {
    ....
 }
        ● 스프링 설정 파일
 <bean name="run" class="kame.SomeRunnable" />
 <bean name="job" class="kame.Job" />

 <bean name="executor1" class="kame.JobExecutor">
    <constructor-arg ref="run" />
 </bean>

 <bean name="executor2" class="kame.JobExecutor">
    <constructor-arg ref="job" />
 </bean>
         - executor1 빈을 생성할 때에는 Runnable(SomeRunnable의 타입이 Runnable이므로)을 전달받는 JobExecutor 생성자 사용.
         - executor2 빈을 생성할 때에는 Job을 전달받는 JobExecutor 생성자 사용.
      ○ 예제
        - 두 개 이상의 생성자에서 기본 데이터 타입이나 래퍼 타입을 사용하여 생성하는 클래스 설정.
        ● 세 개의 생성자를 제공하는 클래스
 public class JobExector {
    public JobExecutor(String name, int seconds) { ... }
    public JobExecutor(String name, long millis) { ... }
    public JobExecutor(String name, String seconds) { ... }
 }
        ● 스프링 설정 파일1
 <bean name="executor" class="kame.spring.chap02.JobExecutor">
    <constructor-arg>
        <value>실행기1</value>
    </constructor-arg>
    <constructor-arg>
        <value>3000</value>
    </constructor-arg>
 </bean>

         - 스프링은 기본적으로 <value>에 전달된 값을 java.lang.String 타입으로 처리.
         - 두 번째 파라미터가 String 타입인 생성자를 사용해서 객체를 생성.
         - 만약 매칭되는 파라미터 타입이 String인 생성자가 존재하지 않을 경우 <value>에 전달된 값에 따라 두 번째 파라미터가 알맞는

           데이터 타입인 int인 생성자가 사용.
        ● 스프링 설정 파일2

 <bean name="executor" class="kame.spring.chap02.JobExecutor">
    <constructor-arg>
        <value>실행기1</value>
    </constructor-arg>
    <constructor-arg>
        <value type="long">3000</value>
    </constructor-arg>
 </bean>
         - <value> 태그에 type 속성을 추가하면 직접 매칭될 파라미터의 타입을 명시 가능.
         - <value> 태그뿐만 아니라 <constructor-arg> 태그에 type속성을 추가해도 동일한 동작을 함.
    ■ 프로퍼티 설정 방식
      - setXXXX() 형태의 설정 메서드를 통해서 필요한 객체와 값을 전달 받음.
        (setXXXX() 형태의 메서드에서 프로퍼티의 이름은 XXXX가 됨.)
      ○ 설정 메서드를 통해 의존하는 객체 전달 받기
 public class WriteArticleServiceImpl implements WriteArticleService {
    private ArticleDao articleDao;

    public void setArticleDao(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }
 }
      ○ <property> 태그
        - 프로퍼티에 값을 전달.
        ● <property> 태그를 이용한 프로퍼티 값 설정
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl">
    <property name="articleDao">
        <ref bean="mysqlArticleDao" />
    </property>
 </bean>
          - <property> 태그에서도 <ref> 태그를 이용하여 빈 객체를 프로퍼티의 값으로 전달할 수 있음.
        ● 설정 메소드가 전달받는 값이 기본데이터 타입이나 String 타입일 경우
          - <value> 태그를 사용하여 설정.
 <bean name="lockingFailManager" class="kame.spring.chap02.PessimisticLockingFailManager">
    <property name="retryCount">
        <value>3</value>
    </property>
 </bean>
        ● 빈 객체와 기본 데이터 타입값 전달
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>
    ■ XML 네임스페이스를 이용한 프로퍼티 설정
      - XML 네임스페이스를 이용하면 <property> 태그를 사용하지 않고 좀 더 간단한 방법으로 프로퍼티의 값 설정 가능.
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="monitor" class="kame.spring.chap02.SystemMonitor"
        p:periodTime="10" 
        p:sender-ref="smsSender" />

    <bean id="smsSender" class="kame.spring.chap02.SmsSender" />
 </beans>
         - 접두어 "p"를 사용하여 프로퍼티 값 설정.
         - 기본 데이터 타입 설정 : "p:프로퍼티이름" 속성을 사용하여 프로퍼티 값을 설정.
         - 빈 객체를 프로퍼티에 전달 : "p:프로퍼티이름-ref" 속성을 사용.
    ■ 임의 빈 객체 전달
      - 식별 값을 갖지 않는 빈 객체를 생성해서 전달 가능.
      - <constructor-arg> 태그나 <property> 태그에 <bean> 태그를 중첩해서 사용.
 <bean id="monitor" class="kame.spring.chap02.SystemMonitor"
     p:periodTime="10">
    <property name="sender">
        <!-- 임의 빈 객체 -->
        <bean class="kame.spring.chap02.SmsSender">
            <constructor-arg value="true" />
        </bean>
     </property>
 </bean>
         - 임의 빈 객체는 식별 값을 갖지 않기 때문에 임의 빈 객체를 재사용할 수 없음. (식별값을 준다하더라도 사용할 수 없음.)

  □ 컬렉션 타입 프로퍼티 설정
    ■ 컬렉션 타입을 입력받기 위한 스프링 태그
    ■ List 타입과 배열
      ○ 특징
        - java.util.List 타입의 프로퍼티나 생성자 인자에 값 목록을 전달.
        - <list> 태그 사용
      ○ 설정 방법
 public class ProtocolHandler {
    private List<Filter> filters;

    public void setFilters(List<Filter> filters) {
        this.filters = filters;
    }
    ......
 }
 <bean name="handler" class="kame.spring.chap02.ProtocolHandler">
    <property name="filters">
        <list>
            <ref bean="encryptionFilter" />
            <ref bean="zipFilter" />
            <bean class="kame.spring.chap02.HeaderFilter" />
        </list>
    </property>
 </bean>

 <bean name="zipFilter"class="kame.spring.chap02.ZipFilter" />
 <bean name="encryptionFilter" class="kame.spring.chap02.EncryptionFilter" />
      ○ <list> 태그
        - List에 저장된 객체 목록을 <ref> 태그를 이용하여 전달 받음.
        - <bean> 태그를 이용하여 식별 값을 갖지 않는 임의 객체를 List에 전달 가능.
      ○ List에 저장되는 값이 래퍼 타입이거나 String 타입일 경우
        - <value> 태그를 사용하여 값 전달.
        - <list> 태그의 value-type 속성을 이용하여 List에 저장될 값들의 타입 명시 가능.
        - <value> 태그에 type 속성을 이용해도 List에 저장될 값들의 타입 명시 가능.
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- <value> 태그에 명시된 값은 String 타입으로 처리. -->
        <list>
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
 public class PerformanceMonitor {
    private List deviations;

    public setDeviations(List deviations) {
        this.deviations = deviations;
    }
 }
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- value-type 속성을 이용하여 Double 타입으로 처리. -->
        <list value-type="java.lang.Double">
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- value 태그의 type 속성을 이용하여 Double 타입으로 처리. -->
        <list>
            <value type="java.lang.Double">0.2</value>
            <value type="java.lang.Double">0.3</value>
        </list>
    </property>
 </bean>
      ○ Generic 을 이용할 경우
        - <list>나 <value>태그에 값의 타입을 명시하지 않아도 알맞게 타입을 변환.
 public class PerformanceMonitor {
    private List<Double> deviations;

    public setDeviations(List<Double> deviations) {
        this.deviations = deviations;
    }
 }
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- 제너릭을 사용한 경우, 알맞게 타입 처리. -->
        <list>
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
      ○ List에 저장될 값을 표현하기 위해 사용 가능한 태그
        - <ref> : 다른 스프링 빈 객체를 값으로 사용.
        - <bean> : 임의 빈 객체를 생성해서 값으로 사용.
        - <value> : 래퍼 타입이나 String을 값으로 사용.
        - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용.
        - <null> : null 값을 값으로 사용.
      ○ 배열
        - <list> 태그는 배열을 설정할 때도 사용.
 public class ProtocolHandler {
    private Filter[] filters;

    public void setFilters(Filter[] filters) {
        this.filters = filters;
    }
    ......
 }
        - <list> 프로퍼티를 이용해서 값 전달.
    ■ Map 타입
      ○ 특징
        - java.util.Map 타입의 프로퍼티를 설정.
        - <map> 태그 사용.
      ○ 설정 방법
 public class ProtocolHandlerFactory {
    private Map<String, ProtocolHandler> handlers;

    public void setHandlers(Map<String, ProtocolHandler> handlers) {
        this.handlers = handlers;
    }
    .......
 }
 <bean name="handlerFactory" class="kame.spring.chap02.ProtocolHandlerFactory">
    <property name="handlers">
        <map>
            <entry>
                <key><value>soap</value></kay>
                <ref bean="soapHandler" />
            </entry>
            <entry>
                <kay><value>rest</value></kay>
                <ref bean ="restHandler" />
            </entry>
        </map>
    </property>
 </bean>
      ○ <entry> 태그
        - 한 개의 <entry> 태그는 Map에 저장될 한 개의 <키, 값>을 표현.
        - 두 개의 자식 노드를 가지며, 각각 키와 값을 의미.
 <map>
    <entry>
        <kay><키태그>...</키태그></key>
        <값태그>...</값태그>
    </entry>
 </map>
        ● <키태그>와 <값태그>에 지정할 수 있는 태그
          - <ref> : 다른 스프링 빈 객체를 키로 사용.
          - <bean> : 임의 빈 객체를 생성해서 키로 사용.
          - <value> : 래퍼 타입이나 String을 키로 사용.
          - <list>, <map>, <props>, <set> : 컬렉션 객체를 키로 사용.
          - <null> : null 값을 키로 사용.
      ○ 예제
 <map>
    <!-- 키와 값의 타입이 각각 String과 Integer일 경우 지정.-->
    <entry>
        <key><value>1</value></key>
        <value type="java.lang.Integer">1th</value>
    </entry>
    <!-- 빈 객체를 참조할 경우 <ref> 태그를 이용하여 지정. -->
    <entry>
        <key><ref bean="protocol"></key>
        <ref bean="handler" />
    </entry>
 </map>
      ○ <entry> 태그의 속성을 이용하여 표현
        - key, key-ref, value, value-ref 속성을 이용하여 <키, 값> 쌍을 좀 더 간단히 표현.
 <!-- 위 코드와 동일 -->
 <map>
    <entry key="1" value="1th" />
    <entry key-ref="protocol" value-ref="handler" />
 </map>
        - 래퍼 타입이나 String 타입을 키나 값에 할당할 때에는 key 속성과 value 속성을 사용.
        - 빈 객체를 참조할 때에는 key-ref나 value-ref를 사용하여 설정.
      ○ 제러닉을 사용하지 않은 상태에서의 래퍼 타입의 키나 값 설정
        - key-type 속성과 value-ref 속성을 이용하여 키와 값의 타입을 지정.
 <property name="ratio">
    <map key-type="java.lang.Integer" value-type="java.lang.Double">
        <entry ... />
        ......
    </map>
 </property>
    ■ Properties 타입
      ○ 특징
        - java.util.Properties 타입의 프로퍼티 설정.
          (Properties 클래스는 환경변수나 설정 정보와 같이 상황에 따라 변경 되는 값을 저장하기 위한 용도로 사용.)
        - <props> 태그 이용.
      ○ 설정 방법
 <bean name="client" class="kame.spring.chap02.BookClient">
    <property name="config">
        <props>
            <prop key="servier">192.168.1.100</prop>
            <prop key="connectionTimeout">5000</prop>
        </props>
    </property>
 </bean>
         - 프로퍼티 이름 : "server"와 "connectionTimeout"
         - 프로퍼티의 값 : "192.168.1.100"과 ."5000"
      ○ <prop> 태그
        - 한 개의 프로퍼티를 표현.
        - 프로퍼티의 이름은 key 속성을이용하여 입력.
        - 프로퍼티의 값은 <prop>태그의 몸체 내용을 이용하여 입력.
        - 한 개의 <prop> 태그는 Properties 태그에 한 개의 프로퍼티로 저장.
          (Properties.getProperty(String name)메서드를 이용하여 프로퍼티 값을 사용.)
 public class BookClient {
    private Properties config;

    public void setConfig(Properties config) {
        this.config = config;
    }

    public void connect() {
        String serverIp = config.getProperty("servier");
        ......
    }
 }
    ■ Set 타입
      ○ 특징
        - java.util.Set 타입의 프로퍼티를 설정.
        - <set>태그를 이용.
      ○ 설정방법
 <property name="subset">
    <set value-type="java.lang.Integer">
        <value>10</value>
        <value>20</value>
        <value>30</value>
    </set>
 </property>
      ○ <set> 태그
        - 집합에 저장될 값을 <value> 태그나 <ref> 등의 태그를 이용하여 표시.
        - 래퍼 타입인 경우 <list>나 <map>의 경우처럼 value-type 속성을 이용하여 저장될 값의 타입을 명시.
          (<value>태그의 type 속성도 이용 가능.)
        ● 값을 지정할 수 있는 태그
          - <ref> :  다른 스프링 빈 객체를 값으로 사용.
          - <bean> : 임의 빈 객체를 생성해서 값으로 사용.
          - <value> : 래퍼 타입이나 String을 값으로 사용.
          - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용.
          - <null> : null 값을 값으로 사용.

  □ 의존 관계 자동 설정
    ■ 빈 객체 간의 의존 관계 설정
      - <property> 태그를 이용하여 설정.
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl">
    <property name="articleDao">
        <ref bean="articleDao" />
    </property>
 </bean>

 <bean name="articleDao" class="kame.spring.chap02.MysqlArticleDao">
 </bean>
         - writeArticleService 빈 객체에서 articleDao 객체로의 하나의 의존 관계만을 포함.
    ■ 의존관계 자동 설정
      - 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정할 수 있는 기능 제공.
        (설정 파일의 크기를 줄일 수 있음.)
      - 자동 설정과 관련하여 별도의 설정을 하지 않으면 자동 설정을 사용하지 않게 됨.
      ○ 자동설정 방식
      ○ 특정 방식을 이용하여 의존 객체 설정
        - <bean> 태그에 autowire 속성을 값을 알맞게 지정.
 <bean id="monitor" class="kame.spring.chap02.SystemMonitor" autowire="byName" />
        ● autowire 속성
          - 기본 값 : default (default-autowire 속성의 값을 사용.)
      ○ 설정 파일에 포함된 모든 빈 객체에 대해서 특정 방식의 자동 설정 적용
        - <beans> 태그의 default-autowire 속성의 값에 설정 방식을 지정.
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
     default-autowire="byName">
    ....
 </beans>
        ● default-autowire 속성
          - 기본 값 : no (자동 설정 하지 않음.)
    ■ 프로퍼티 이름을 이용한 의존 관계 자동 설정
      ○ 특징
        - byName 방식.
        - 프로퍼티 이름과 동일한 이름을 갖는 빈 객체를 프로퍼티 값으로 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl
     autowire="byName" />

 <bean name="articleDao" class="kame.spring.chap02.MysqlArticleDao" />
 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
         - WriteArticleServiceImpl 클래스가 이름이 "articleDao"인 프로퍼티를 갖고 있다면, 이름이 "articleDao"인 빈 객체가 프로퍼티의
           값으로 전달됨.
      ○ 단점
        - 코드를 리팩토링해서 프로퍼티의 이름을 변경하는 경우 기존에 올바르게 동작하던 설정 파일이 올바르게 동작하지 않을 수도
          있음.
    ■ 프로퍼티 타입을 이용한 의존 관계 자동 설정
      ○ 특징
        - byType 방식.
        - 프로퍼티의 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byType" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
         - articleDao 프로퍼티에 알맞은 빈 객체 설정.
      ○ 단점
        - 프로퍼티 타입과 동일한 타입의 빈 객체를 오직 1개만 설정 가능. 
          (동일한 타입의 빈 객체가 두 개 이상 존재하게 되면 스프링은 어떤 빈 객체를 사용해야 할 지 알 수 없기 때문에 예외 발생.)
    ■ 생성자 파라미터 타입을 이용한 의존 관계 자동 설정
      ○ 특징
        - constructor 방식.
        - byType 방식처럼 타입을 이용하여 값을 전달. (차이점 : 프로퍼티가 아닌 생성자의 파라미터 타입 사용.)
      ○ 설정 방법
 public class WriteArticleSerivceImpl {
    public WriteArticleServiceImpl(ArticleDao articleDao) {
        .........
    }
 }
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="constructor" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />

         - WriteArticleServiceImpl(ArticleDao articleDao) 생성자의 첫 번째 파라미터에 ArticleDao 타입인 mysqlArticleDao 빈 객체가

           전달됨.
      ○ 단점
        - 생성자 파라미터 타입과 일치하는 빈 객체가 2개 이상 존재할 경우 빈 객체를 생성할 때 예외를 발생시킴.
    ■ 생성자 및 프로퍼티 타입을 이용한 자동 설정
      ○ 특징
        - autodetect 방식.
        - constructor 방식을 먼저 적용하고, constructor 방식을 적용할 수 없는 경우 byType 방식을 적용하여 의존 객체를 설정.
      ○ 설정 방법

 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="autodetect" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
      ○ 단점
        - constructor 방식과 byType 방식을 사용하므로, 동일한 타입의 빈 객체를 2개 이상 정의 할 수 없음.
    ■ 자동 설정과 직접 설정의 혼합
      ○ 특징
        - 자동 설정과 함께 <property> 태그를 이용하여 해당 프로퍼티의 값을 직접 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byName">
    <property name="eventListener" ref="emailAdaptor" />
 </bean>
      ○ 특정 프로퍼티의 값이 자동 설정에 의해 초기화되지 않게 할 경우
        - <null> 태그를 이용하여 프로퍼티의 값을 null로 설정.
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byName">
    <property name="eventListener"><null/></property>
 </bean>


  □ 부모 빈을 통한 설정 재사용
    - 중복되는 설정을 갖는 빈이 다수 존재할 경우, 중복되는 설정 정보를 담고 있는 부모 빈을 정의한 뒤, 부모 빈 정보를 재사용하도록

      설정.
    ■ 설정 재사용 전

 <bean id="doorMonitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="lobbyMonitor" class="kame.spirng.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="roomMonitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="20" />
    <property name="sender" ref="smsSender" />
 </bean>
         - 빈의 이름만 다를 뿐 나머지 설정은 대부분 동일.
    ■ 부모 빈으로부터 설정 정보 상속
 <bean id="commonMonitor" class="kame.spring.chap02.SystemMonitor"
     abstract="true">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="doorMonitor" parent="commonMonitor" />
 <bean id="lobbyMonitor" parent="commonMonitor" />
 <bean id="roomMonitor" parent="commonMonitor">
    <property name="periodTime" value="20" />
 </bean>

      ○ commonMonitor 빈
        - 빈 클래스를 비롯하여 프로퍼티 설정 등이 포함.
        - abstract="true" : 해당 빈 객체를 생성하지 않음.
        - 설정 정보만 존재할 뿐 실제로 객체는 생성되지 않음.
      ○ 자식 빈
        - parent 속성을 사용하여 클래스 및 프로퍼티 설정 정보를 물려받을 부모빈을 설정.
        - parent 속성을 이용하여 물려받은 설정 정보 중에서 변경하고 싶은 값이 있다면 추가로 입력.
        - 프로퍼티뿐만 아니라 클래스도 새롭게 지정 가능.
    ■ 자식 빈에 class 속성 이용하여 클래스 새롭게 지정
      - class 속성 이용하여 클래스를 새롭게 지정하면 부모 빈에서 설정한 클래스가 아닌 class 속성에 명시한 클래스를 사용하여 빈을

        생성.

 <bean id="commonMonitor" class="kame.spring.chap02.SystemMonitor"
     abstract="true">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <!-- commonMonitor 빈의 프로퍼티 정보를 사용. -->
 <bean id="extMonitor" parent="commonMonitor" class="ExtendedSystemMonitor">
    <property name="defaultResolution" value="high" />
 </bean>
 <!-- 위와 동일 -->
 <bean id="extMonitor" class="ExtendedSystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
    <property name="defaultResolution" value="high" />
 </bean>


'프로그래밍 > java' 카테고리의 다른 글

poi cell Number 포맷 문자로 읽기  (0) 2016.11.04
에러코드 정리  (0) 2016.05.25
스프링 DI  (0) 2016.03.29
에자일 방법론  (0) 2016.03.29
java.lang.UnsupportedClassVersionError  (0) 2016.03.28
java 윤년, 평년 구분하기  (0) 2016.01.18
블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.