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> |