Skip to content

Latest commit

Β 

History

History
498 lines (400 loc) Β· 31.5 KB

IoC.md

File metadata and controls

498 lines (400 loc) Β· 31.5 KB

Spring IoC μ»¨ν…Œμ΄λ„ˆμ™€ λΉˆμ— λŒ€ν•œ μ†Œκ°œ

이 μž₯μ—μ„œλŠ” IoC (Inversion of Control) μ›λ¦¬μ˜ Spring Framework κ΅¬ν˜„μ— λŒ€ν•΄ λ‹€λ£Ήλ‹ˆλ‹€.
IoCλŠ” 쒅속성 μ£Όμž… (DI) μ΄λΌκ³ λ„ν•©λ‹ˆλ‹€.
이것은 객체가 μƒμ„±μž 인수, νŒ©ν† λ¦¬ λ©”μ†Œλ“œμ— λŒ€ν•œ 인수 λ˜λŠ” νŒ©ν† λ¦¬ λ©”μ†Œλ“œμ—μ„œ μƒμ„±λ˜κ±°λ‚˜
리턴 된 객체 μΈμŠ€ν„΄μŠ€μ— μ„€μ •λœ νŠΉμ„±μ„ ν†΅ν•΄μ„œλ§Œ 쒅속성, 즉 μž‘μ—…ν•˜λŠ” λ‹€λ₯Έ 객체λ₯Ό μ •μ˜ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€.
그런 λ‹€μŒ μ»¨ν…Œμ΄λ„ˆλŠ” Bean을 μž‘μ„±ν•  λ•Œ μ΄λŸ¬ν•œ 쒅속성을 μ£Όμž…ν•©λ‹ˆλ‹€.
이 ν”„λ‘œμ„ΈμŠ€λŠ” 근본적으둜 λ°˜λΉ„λ‘€ν•˜λ―€λ‘œ 클래슀 직접 μž‘μ„± λ˜λŠ” Service Locator νŒ¨ν„΄κ³Ό 같은
λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ’…μ†μ„±μ˜ μΈμŠ€ν„΄μŠ€ λ˜λŠ” μœ„μΉ˜λ₯Ό μ œμ–΄ν•˜λŠ” Bean 자체의 Inversion of Control (IoC)μž…λ‹ˆλ‹€.

org.springframework.beans와 org.springframework.context νŒ¨ν‚€μ§€λŠ” Spring Framework의 IoC μ»¨ν…Œμ΄λ„ˆμ˜ 기초

ApplicationContext λŠ” Bean factory의 μ™„μ „ν•œ μˆ˜νΌμ…‹

Bean factory BeanFactory μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ“  μœ ν˜•μ˜ 객체λ₯Ό 관리 ν•  μˆ˜μžˆλŠ” κ³ κΈ‰ ꡬ성 λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. BeanFactoryλŠ” ꡬ성 ν”„λ ˆμž„ μ›Œν¬μ™€ κΈ°λ³Έ κΈ°λŠ₯을 제곡

ApplicationContext ApplicationContextλŠ” BeanFactory의 ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€. ApplicationContextλŠ” 더 λ§Žμ€ μ—”ν„°ν”„λΌμ΄μ¦ˆ 별 κΈ°λŠ₯을 μΆ”κ°€ν•©λ‹ˆλ‹€.

Springμ—μ„œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 백본을 ν˜•μ„±ν•˜κ³ 
Spring IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 객체λ₯Ό Bean이라고 λΆ€λ₯Έλ‹€.

Bean은 Spring IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μΈμŠ€ν„΄μŠ€ν™”, μ–΄μ…ˆλΈ” 링 및 κ΄€λ¦¬λ˜λŠ” 객체이닀.
μœ„μ˜ 말처럼 κ΄€λ¦¬λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λΉˆμ€ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ λ§Žμ€ 객체 쀑 ν•˜λ‚˜ μΌλΏμž…λ‹ˆλ‹€.

λΉˆλ“€κ³Ό κ·Έ μ‚¬μ΄μ˜ μ˜μ‘΄μ„±μ€ μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•˜λŠ” μ»¨ν”Όκ·œλ ˆμ΄μ…˜ 메타 데이터에 λ°˜μ˜λ©λ‹ˆλ‹€.

Container overview

org.springframework.context.ApplicationContext μΈν„°νŽ˜μ΄μŠ€λŠ”
Spring IoC μ»¨ν…Œμ΄λ„ˆλ₯Ό λ‚˜νƒ€λ‚΄λ©°
μ•žμ„œ μ–ΈκΈ‰ ν•œ bean을 μΈμŠ€ν„΄μŠ€ν™”, ꡬ성 및 μ–΄μ…ˆλΈ” ν•  μ±…μž„μ΄μžˆλ‹€.

μ»¨ν…Œμ΄λ„ˆλŠ” ꡬ성 메타 데이터λ₯Ό 읽음으둜써 μΈμŠ€ν„΄μŠ€ν™”, ꡬ성 및 μ–΄μ…ˆλΈ” ν•  객체에 λŒ€ν•œ 지침을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
ꡬ성 메타 λ°μ΄ν„°λŠ” XML, Java μ–΄λ…Έν…Œμ΄μ…˜ λ˜λŠ” Java μ½”λ“œλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.
이 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” κ°œμ²΄μ™€ κ·ΈλŸ¬ν•œ 개체 κ°„μ˜ ν’λΆ€ν•œ μƒν˜Έ 쒅속성을 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ApplicationContext μΈν„°νŽ˜μ΄μŠ€μ˜ μ—¬λŸ¬ κ΅¬ν˜„μ€ Springκ³Ό ν•¨κ»˜ μ¦‰μ‹œ μ œκ³΅λ©λ‹ˆλ‹€.
독립 μ‹€ν–‰ ν˜• μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œλŠ”
ClassPathXmlApplicationContext λ˜λŠ” FileSystemXmlApplicationContext의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.

XML은 μ»¨ν”Όκ·œλ ˆμ΄μ…˜ 메타 데이터λ₯Ό μ •μ˜ν•˜κΈ°μœ„ν•œ 전톡적인 ν˜•μ‹ μ΄μ—ˆμ§€λ§Œ
μ»¨ν…Œμ΄λ„ˆμ— Java μ£Όμ„μ΄λ‚˜ μ½”λ“œλ₯Ό 메타 데이터 ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜λ„λ‘ μ§€μ‹œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
...

1.2.1. Configuration metadata

Spring IoC μ»¨ν…Œμ΄λ„ˆλŠ” ꡬ성 메타 λ°μ΄ν„°μ˜ ν˜•νƒœλ₯Ό μ‚¬μš©ν•œλ‹€.
이 ꡬ성 메타 λ°μ΄ν„°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžκ°€ Spring μ»¨ν…Œμ΄λ„ˆμ—κ²Œ
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 객체λ₯Ό μΈμŠ€ν„΄μŠ€ν™”, ꡬ성 및 μ–΄μ…ˆλΈ”ν•˜λ„λ‘ μ§€μ‹œν•˜λŠ” 방법을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ»¨ν”Όκ·œλ ˆμ΄μ…˜ 메타 λ°μ΄ν„°λŠ” μ „ν†΅μ μœΌλ‘œ κ°„λ‹¨ν•˜κ³  직관적 인 XML ν˜•μ‹μœΌλ‘œ 제곡되며,
이 μž₯의 λŒ€λΆ€λΆ„μ€ Spring IoC μ»¨ν…Œμ΄λ„ˆμ˜ μ£Όμš” κ°œλ…κ³Ό κΈ°λŠ₯을 μ „λ‹¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

**XML 기반 메타 λ°μ΄ν„°λŠ” ꡬ성 메타 λ°μ΄ν„°μ˜ μœ μΌν•œ ν—ˆμš© ν˜•μ‹μ΄ μ•„λ‹™λ‹ˆλ‹€.
Spring IoC μ»¨ν…Œμ΄λ„ˆ μžμ²΄λŠ”μ΄ ꡬ성 메타 데이터가 μ‹€μ œλ‘œ μž‘μ„±λœ ν˜•μ‹κ³Ό μ™„μ „νžˆ λΆ„λ¦¬λ˜μ–΄μžˆλ‹€.
μš”μ¦˜ λ§Žμ€ κ°œλ°œμžλ“€μ΄ Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„μœ„ν•œ Java 기반의 ꡬ성을 μ„ νƒν•©λ‹ˆλ‹€.

Spring μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ‹€λ₯Έ ν˜•μ‹μ˜ 메타 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•œ μ •λ³΄λŠ” λ‹€μŒμ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.
μ–΄λ…Έν…Œμ΄μ…˜ 기반 μ„€μ • : μŠ€ν”„λ§ 2.5λŠ” μ–΄λ…Έν…Œμ΄μ…˜ 기반 μ„€μ • 메타 데이터에 λŒ€ν•œ 지원을 λ„μž…ν–ˆλ‹€.
Java 기반 ꡬ성
: Spring 3.0λΆ€ν„°λŠ” Spring JavaConfig ν”„λ‘œμ νŠΈκ°€ μ œκ³΅ν•˜λŠ” λ§Žμ€ κΈ°λŠ₯듀이 핡심 Spring ν”„λ ˆμž„ μ›Œν¬μ˜ μΌλΆ€κ°€λ˜μ—ˆλ‹€.
λ”°λΌμ„œ XML 파일이 μ•„λ‹Œ Javaλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‘μš© ν”„λ‘œκ·Έλž¨ 클래슀 μ™ΈλΆ€μ˜ Bean을 μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λŸ¬ν•œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ @Configuration, @Bean, @Import 및 @DependsOn 주석을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

Spring 섀정은 μ»¨ν…Œμ΄λ„ˆκ°€ κ΄€λ¦¬ν•΄μ•Όν•˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 빈 μ •μ˜λ‘œ κ΅¬μ„±λœλ‹€.
XML 기반 ꡬ성 메타 λ°μ΄ν„°λŠ” μ΅œμƒμœ„ 레벨 <beans /> μš”μ†Œ 내에 <bean /> μš”μ†Œλ‘œ κ΅¬μ„±λœ μ΄λŸ¬ν•œ bean을 ν‘œμ‹œν•©λ‹ˆλ‹€.
Java ꡬ성은 일반적으둜 @Configuration 클래슀 λ‚΄μ—μ„œ @Bean μ£Όμ„μ΄μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

이 bean μ •μ˜λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” μ‹€μ œ 객체에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

?? 일반적으둜 μ„œλΉ„μŠ€ 계측 개체, 데이터 μ•‘μ„ΈμŠ€ 개체 (DAO), Struts Action μΈμŠ€ν„΄μŠ€μ™€ 같은 ν”„λ ˆμ  ν…Œμ΄μ…˜ 개체,
Hibernate SessionFactories, JMS Queue와 같은 인프라 개체 등을 μ •μ˜ν•©λ‹ˆλ‹€.
일반적으둜 도메인 객체λ₯Ό λ§Œλ“€κ³ λ‘œλ“œν•˜λŠ” 것은 DAO와 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 μ±…μž„μ΄κΈ° λ•Œλ¬Έμ—
일반적으둜 μ»¨ν…Œμ΄λ„ˆμ— Fine-grained 도메인 객체λ₯Ό κ΅¬μ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
??

κ·ΈλŸ¬λ‚˜ AspectJ와 Spring의 톡합을 μ‚¬μš©ν•˜μ—¬ IoC μ»¨ν…Œμ΄λ„ˆμ˜ μ œμ–΄ λ²”μœ„ λ°–μ—μ„œ 생성 된 객체λ₯Ό ꡬ성 ν•  μˆ˜μžˆλ‹€.
AspectJλ₯Ό μ‚¬μš©ν•˜μ—¬ Spring에 μ˜μ‘΄μ„± μ‚½μž… 도메인 객체λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

λ‹€μŒ μ˜ˆμ œλŠ” XML 기반 ꡬ성 메타 λ°μ΄ν„°μ˜ κΈ°λ³Έ ꡬ쑰λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

<?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.xsd">

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here(더 λ§Žμ€ bean μ •μ˜κ°€ μ—¬κΈ°μ—μžˆλ‹€.) -->

</beans>

id 속성은 κ°œλ³„ bean μ •μ˜λ₯Ό μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
class 속성은 빈의 μœ ν˜•μ„ μ •μ˜ν•˜κ³  μ™„μ „ν•œ 클래슀 이름을 μ‚¬μš©ν•©λ‹ˆλ‹€.
id 속성 값은 ν˜‘μ—…ν•˜λŠ” 객체λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.
ν˜‘μ—… 였브젝트λ₯Ό μ°Έμ‘°ν•˜κΈ°μœ„ν•œ XML은이 μ˜ˆμ œμ— ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μžμ„Έν•œ μ •λ³΄λŠ” 쒅속성을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

1.2.2. Instantiating a container

Spring IoC μ»¨ν…Œμ΄λ„ˆλ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” 것은 κ°„λ‹¨ν•˜λ‹€.
ApplicationContext μƒμ„±μžμ— 제곡된 μœ„μΉ˜ κ²½λ‘œλŠ” μ‹€μ œλ‘œ μ»¨ν…Œμ΄λ„ˆκ°€
Java CLASSPATH λ“±μ˜ 둜컬 파일 μ‹œμŠ€ν…œκ³Ό 같은
λ‹€μ–‘ν•œ μ™ΈλΆ€ λ¦¬μ†ŒμŠ€μ˜ ꡬ성 메타 데이터λ₯Όλ‘œλ“œ ν•  μˆ˜μžˆκ²Œν•˜λŠ” λ¦¬μ†ŒμŠ€ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

?? Spring의 IoC μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•΄ μ•Œκ²Œ 된 ν›„μ—λŠ” Resourcesμ—μ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ
Spring의 Resource 좔상화에 λŒ€ν•΄ 더 μ•Œκ³  싢을 것이닀.
URI κ΅¬λ¬Έμ—μ„œ μ •μ˜ 된 μœ„μΉ˜μ—μ„œ InputStream을 μ½λŠ” νŽΈλ¦¬ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•œλ‹€.
특히 λ¦¬μ†ŒμŠ€ κ²½λ‘œλŠ” μ‘μš© ν”„λ‘œκ·Έλž¨ μ»¨ν…μŠ€νŠΈ 및 λ¦¬μ†ŒμŠ€ κ²½λ‘œμ—μ„œ μ„€λͺ…ν•œλŒ€λ‘œ μ‘μš© ν”„λ‘œκ·Έλž¨ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
?? λ‹€μŒ μ˜ˆμ œμ—μ„œλŠ” μ„œλΉ„μŠ€ 계측 객체 (services.xml) ꡬ성 νŒŒμΌμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

<?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.xsd">

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</beans>

λ‹€μŒ μ˜ˆμ œλŠ” 데이터 μ•‘μ„ΈμŠ€ 객체 daos.xml νŒŒμΌμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

<?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.xsd">

    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

μ•žμ˜ μ˜ˆμ—μ„œ μ„œλΉ„μŠ€ 계측은 PetStoreServiceImpl ν΄λž˜μŠ€μ™€ JpaAccountDao 및 JpaItemDao μœ ν˜•μ˜
두 데이터 μ•‘μ„ΈμŠ€ 객체 (JPA 객체 / 관계 맀핑 ν‘œμ€€μ„ 기반으둜 함)둜 κ΅¬μ„±λ©λ‹ˆλ‹€.
property name μš”μ†ŒλŠ” JavaBean μ†μ„±μ˜ 이름을 μ°Έμ‘°ν•˜κ³  ref μš”μ†ŒλŠ” λ‹€λ₯Έ bean μ •μ˜μ˜ 이름을 μ°Έμ‘°ν•©λ‹ˆλ‹€.
id와 ref μš”μ†Œ μ‚¬μ΄μ˜μ΄ 연결은 곡동 μž‘μ—… 객체 κ°„μ˜ 쒅속성을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
객체의 쒅속성 ꡬ성에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 쒅속성을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

XML 기반 ꡬ성 메타 데이터 μž‘μ„±(Composing XML-based configuration metadata)

빈 μ •μ˜κ°€ μ—¬λŸ¬ XML νŒŒμΌμ— κ±Έμ³μžˆλŠ” 것이 유용 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
각 κ°œλ³„ XML ꡬ성 νŒŒμΌμ€ μ’…μ’… μ•„ν‚€ν…μ²˜μ˜ 논리 계측 λ˜λŠ” λͺ¨λ“ˆμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ‘μš© ν”„λ‘œκ·Έλž¨ μ»¨ν…μŠ€νŠΈ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  XML μ‘°κ°μ—μ„œ bean μ •μ˜λ₯Όλ‘œλ“œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이 μƒμ„±μžλŠ” 이전 μ„Ήμ…˜μ—μ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ μ—¬λŸ¬ Resource μœ„μΉ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
λ˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ <import /> μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ 파일의 bean μ •μ˜λ₯Όλ‘œλ“œν•˜μ‹­μ‹œμ˜€.
예 :

<beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>

μ•žμ˜ μ˜ˆμ œμ—μ„œ μ™ΈλΆ€ bean μ •μ˜λŠ” μ„Έ νŒŒμΌμ—μ„œλ‘œλ“œλ©λ‹ˆλ‹€.
services.xml, messageSource.xml 및 themeSource.xml
services.xml은 importλ₯Ό μˆ˜ν–‰ν•˜λŠ” 파일과 λ™μΌν•œ 디렉토리 λ˜λŠ” 클래슀 경둜 μœ„μΉ˜μ— μžˆμ–΄μ•Όν•˜λ©°,
messageSource.xml 및 themeSource.xml은 resource/ μœ„μΉ˜μ— μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.
λ³΄μ‹œλ‹€μ‹œν”Ό, μ„ ν–‰ μŠ¬λž˜μ‹œλŠ” λ¬΄μ‹œλ˜μ§€λ§Œ,
이 κ²½λ‘œλŠ” μƒλŒ€ κ²½λ‘œμ΄λ―€λ‘œ μŠ¬λž˜μ‹œλ₯Ό μ „ν˜€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 더 μ’‹μŠ΅λ‹ˆλ‹€.
μ΅œμƒμœ„ μˆ˜μ€€ 인 <beans /> μš”μ†Œλ₯Ό ν¬ν•¨ν•˜μ—¬ κ°€μ Έμ˜¬ 파일의 λ‚΄μš©μ€
Spring μŠ€ν‚€λ§ˆμ— 따라 μœ νš¨ν•œ XML bean μ •μ˜ μ—¬μ•Όν•©λ‹ˆλ‹€. ?

μƒλŒ€μ  "../"경둜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμœ„ λ””λ ‰ν† λ¦¬μ˜ νŒŒμΌμ„ μ°Έμ‘°ν•˜λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ ꢌμž₯ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
μ΄λ ‡κ²Œν•˜λ©΄ ν˜„μž¬ μ‘μš© ν”„λ‘œκ·Έλž¨ μ™ΈλΆ€μ—μžˆλŠ” νŒŒμΌμ— λŒ€ν•œ 쒅속성이 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.
특히,이 μ°Έμ‘°λŠ” "classpath :"URL (예 : "classpath : ../ services.xml")μ—λŠ” ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μ—¬κΈ°μ„œ λŸ°νƒ€μž„ 확인 ν”„λ‘œμ„ΈμŠ€λŠ” "κ°€μž₯ κ°€κΉŒμš΄"클래슀 경둜 루트λ₯Ό μ„ νƒν•˜κ³  μƒμœ„ 디렉토리λ₯Ό μ‘°μ‚¬ν•©λ‹ˆλ‹€.
클래슀 경둜 ꡬ성 λ³€κ²½μœΌλ‘œ 인해 λ‹€λ₯Έ 디렉토리가 잘λͺ» 선택 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μƒλŒ€ 경둜 λŒ€μ‹  μ •κ·œν™” 된 λ¦¬μ†ŒμŠ€ μœ„μΉ˜λ₯Ό 항상 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ 예:"file:C:/config/services.xml" or "classpath:/config/services.xml"
κ·ΈλŸ¬λ‚˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ ꡬ성을 νŠΉμ • μ ˆλŒ€ μœ„μΉ˜μ— μ—°κ²°ν•œλ‹€λŠ” 점에 μœ μ˜ν•˜μ‹­μ‹œμ˜€.
일반적으둜 λŸ°νƒ€μž„μ‹œ JVM μ‹œμŠ€ν…œ 속성에 λŒ€ν•΄ ν™•μΈλ˜λŠ” "$ {...}"자리 ν‘œμ‹œμžλ₯Ό 톡해
μ ˆλŒ€ μœ„μΉ˜μ— λŒ€ν•œ κ°„μ ‘ μ°Έμ‘°λ₯Ό μœ μ§€ν•˜λŠ” 것이 λ°”λžŒμ§ν•©λ‹ˆλ‹€.

import μ§€μ‹œλ¬Έμ€ bean λ„€μž„ 슀페이슀 μžμ²΄μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
일반 Bean μ •μ˜λ₯Ό λ›°μ–΄ λ„˜λŠ” μΆ”κ°€ ꡬ성 κΈ°λŠ₯은 Springμ—μ„œ μ œκ³΅ν•˜λŠ” XML λ„€μž„ 슀페이슀 μ€‘μ—μ„œ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
"context"및 "util"λ„€μž„ 슀페이슀.

1.2.3. Using the container

ApplicationContextλŠ” λ‹€λ₯Έ Beanκ³Ό κ·Έ μ˜μ‘΄μ„±μ˜ λ ˆμ§€μŠ€νŠΈλ¦¬λ₯Ό μœ μ§€ 보수 ν•  μˆ˜μžˆλŠ” κ³ κΈ‰ νŒ©ν† λ¦¬μ˜ μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
T getBean (String name, Class <T> requiredType) λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ bean의 μΈμŠ€ν„΄μŠ€λ₯Ό 검색 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ApplicationContextλ₯Ό μ‚¬μš©ν•˜λ©΄ Bean μ •μ˜λ₯Ό 읽고 λ‹€μŒκ³Ό 같이 μ•‘μ„ΈμŠ€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance(κ΅¬μ„±λœ μΈμŠ€ν„΄μŠ€ 검색)
PetStoreService service = context.getBean("petStore", PetStoreService.class);

// use configured instance(κ΅¬μ„±λœ μΈμŠ€ν„΄μŠ€ μ‚¬μš©)
List<String> userList = service.getUsernameList();

κ°€μž₯ μœ μ—°ν•œ λ³€ν˜•μ€ GenericApplicationContext이며 리더 μœ„μž„μžμ™€ ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.
XML 파일 용 XmlBeanDefinitionReader μ‚¬μš© :

GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
context.refresh();

μ΄λŸ¬ν•œ 리더 μœ„μž„μžλŠ” λ™μΌν•œ ApplicationContextμ—μ„œ ν˜Όν•©λ˜κ³  λ§€μΉ˜λ˜μ–΄ 원할 경우 λ‹€μ–‘ν•œ ꡬ성 μ†ŒμŠ€μ˜ Bean μ •μ˜λ₯Ό 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

그런 λ‹€μŒ getBean을 μ‚¬μš©ν•˜μ—¬ 빈의 μΈμŠ€ν„΄μŠ€λ₯Ό 검색 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ApplicationContext μΈν„°νŽ˜μ΄μŠ€μ—λŠ” Bean을 κ²€μƒ‰ν•˜λŠ” λͺ‡ 가지 λ‹€λ₯Έ λ©”μ†Œλ“œκ°€ μžˆμ§€λ§Œ
μ΄μƒμ μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλŠ” 이λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.
μ‹€μ œλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ—λŠ” getBean () λ©”μ†Œλ“œμ— λŒ€ν•œ 호좜이 μ „ν˜€ μ—†μ–΄μ•Όν•˜λ―€λ‘œ Spring API에 μ „ν˜€ μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€.
예λ₯Ό λ“€μ–΄ Spring의 μ›Ή ν”„λ ˆμž„ μ›Œν¬μ™€μ˜ 톡합은
컨트둀러 및 JSF 관리 빈과 같은 λ‹€μ–‘ν•œ μ›Ή ν”„λ ˆμž„ μ›Œν¬ ꡬ성 μš”μ†Œμ— λŒ€ν•œ 쒅속성 μ£Όμž…μ„ μ œκ³΅ν•˜λ―€λ‘œ
메타 데이터 (예 : μžλ™ 와이어 링 주석)λ₯Ό 톡해 νŠΉμ • λΉˆμ— λŒ€ν•œ 쒅속성을 μ„ μ–Έ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
??

1.3. Bean overview

Spring IoC μ»¨ν…Œμ΄λ„ˆλŠ” ν•˜λ‚˜ μ΄μƒμ˜ λΉˆμ„ κ΄€λ¦¬ν•œλ‹€.
이 bean은 μ»¨ν…Œμ΄λ„ˆμ— μ œκ³΅ν•˜λŠ” ꡬ성 메타 데이터 (예 : XML μ •μ˜μ˜ 양식)둜 μž‘μ„±λ©λ‹ˆλ‹€.
μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ μ΄λŸ¬ν•œ bean μ •μ˜λŠ” (λ‹€λ₯Έ 정보듀 μ‚¬μ΄μ—μ„œ) λ‹€μŒ 메타 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” BeanDefinition 객체둜 ν‘œν˜„λ©λ‹ˆλ‹€.

  • (A package-qualified class name:)νŒ¨ν‚€μ§€ μˆ˜μ‹ 클래슀 λͺ… : 일반적으둜, μ •μ˜λ˜κ³ μžˆλŠ” bean의 μ‹€μ œμ˜ κ΅¬ν˜„ 클래슀.
  • Bean이 μ»¨ν…Œμ΄λ„ˆμ—μ„œ μž‘λ™ν•˜λŠ” 방법 (λ²”μœ„, 수λͺ…μ£ΌκΈ° 콜백 λ“±)을 λ‚˜νƒ€λ‚΄λŠ” Bean 비헀이비어 ꡬ성 μš”μ†Œ. ?
  • Bean이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λ‹€λ₯Έ bean에 λŒ€ν•œ μ°Έμ‘°. μ΄λŸ¬ν•œ μ°Έμ‘°λŠ” 곡동 μž‘μ—…μž(called collaborators) λ˜λŠ” μ’…μ†μ„±μ΄λΌκ³ λ„ν•©λ‹ˆλ‹€.
  • μƒˆλ‘œ 생성 된 객체에 μ„€μ •ν•  기타 ꡬ성 μ„€μ • (예 : μ—°κ²° 풀을 κ΄€λ¦¬ν•˜λŠ” Beanμ—μ„œ μ‚¬μš©ν•  μ—°κ²° 수 λ˜λŠ” ν’€μ˜ 크기 μ œν•œ).

이 메타 λ°μ΄ν„°λŠ” 각 bean μ •μ˜λ₯Ό κ΅¬μ„±ν•˜λŠ” 속성 μ„ΈνŠΈλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.
bean μ •μ˜

Property Explained in…
class Instantiating beans
name Naming beans
scope Bean scopes
constructor arguments Β  Dependency Injection
properties Dependency Injection
autowiring mode Autowiring collaborators
lazy-initialization mode Lazy-initialized beans
initialization method Initialization callbacks
destruction method Destruction callbacks

νŠΉμ • bean을 μž‘μ„±ν•˜λŠ” 방법에 λŒ€ν•œ 정보가 λ“€μ–΄μžˆλŠ” bean μ •μ˜ 외에,
ApplicationContext κ΅¬ν˜„μ€ μ‚¬μš©μžκ°€ μ»¨ν…Œμ΄λ„ˆ μ™ΈλΆ€μ—μ„œ 생성 된 κΈ°μ‘΄ 객체의 등둝도 ν—ˆμš©ν•©λ‹ˆλ‹€.
이것은 BeanFactory κ΅¬ν˜„ DefaultListableBeanFactoryλ₯Ό λ¦¬ν„΄ν•˜λŠ” getBeanFactory () λ©”μ†Œλ“œλ₯Ό 톡해
ApplicationContext의 BeanFactory에 μ•‘μ„ΈμŠ€ν•¨μœΌλ‘œμ¨ 이루어진닀.
DefaultListableBeanFactoryλŠ” registerSingleton (..) 및 registerBeanDefinition (..) λ©”μ†Œλ“œλ₯Ό 톡해이 등둝을 μ§€μ›ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 일반적인 μ‘μš© ν”„λ‘œκ·Έλž¨μ€ 메타 데이터 bean μ •μ˜λ₯Ό 톡해 μ •μ˜ 된 beanμ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

Bean 메타 데이터와 μˆ˜λ™μœΌλ‘œ μ œκ³΅λ˜λŠ” μ‹±κΈ€ 톀 μΈμŠ€ν„΄μŠ€λŠ” μžλ™ 와이어 링 및 기타 인트둜 μŠ€νŽ™ μ…˜ λ‹¨κ³„μ—μ„œ
μ»¨ν…Œμ΄λ„ˆκ°€ μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•΄ 적절히 μΆ”λ‘  ν•  수 μžˆλ„λ‘ κ°€λŠ₯ν•œ 빨리 λ“±λ‘ν•΄μ•Όν•©λ‹ˆλ‹€.
κΈ°μ‘΄ 메타 데이터와 κΈ°μ‘΄ μ‹±κΈ€ 톀 μΈμŠ€ν„΄μŠ€μ˜ μ˜€λ²„λΌμ΄λ“œλŠ” μ–΄λŠ 정도 μ§€μ›λ˜μ§€λ§Œ,
λŸ°νƒ€μž„μ‹œ μƒˆ bean의 등둝 (νŒ©ν† λ¦¬μ— λŒ€ν•œ 라이브 μ•‘μ„ΈμŠ€μ™€ λ™μ‹œμ—)은 κ³΅μ‹μ μœΌλ‘œ μ§€μ›λ˜μ§€ μ•ŠμœΌλ©°
콩 μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ™μ‹œ μ•‘μ„ΈμŠ€ μ˜ˆμ™Έ 및 / λ˜λŠ” 뢈일치 μƒνƒœλ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. ?

1.3.1. Naming beans

Naming beans λͺ¨λ“  λΉˆμ—λŠ” ν•˜λ‚˜ μ΄μƒμ˜ μ‹λ³„μžκ°€ μžˆμŠ΅λ‹ˆλ‹€.
μ΄λŸ¬ν•œ μ‹λ³„μžλŠ” Bean을 ν˜ΈμŠ€νŒ…ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ κ³ μœ ν•΄μ•Όν•©λ‹ˆλ‹€.
bean은 λŒ€κ°œ 단 ν•˜λ‚˜μ˜ μ‹λ³„μžλ₯Ό 가지고 μžˆμ§€λ§Œ, ν•˜λ‚˜ μ΄μƒμ˜ μ‹λ³„μžκ°€ ν•„μš”ν•œ 경우 μ—¬λΆ„μ˜ μ‹λ³„μžλŠ” λ³„μΉ­μœΌλ‘œ κ°„μ£Ό 될 수 μžˆμŠ΅λ‹ˆλ‹€.
XML 기반 ꡬ성 메타 λ°μ΄ν„°μ—μ„œ id 및 / λ˜λŠ” name 속성을 μ‚¬μš©ν•˜μ—¬ bean μ‹λ³„μžλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
id 속성을 μ‚¬μš©ν•˜λ©΄ μ •ν™•νžˆ ν•˜λ‚˜μ˜ idλ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
일반적으둜 μ΄λŸ¬ν•œ 이름은 영숫자 ( 'myBean', 'fooService'λ“±)μ΄μ§€λ§Œ 특수 λ¬Έμžλ„ 포함 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Bean에 λ‹€λ₯Έ 별λͺ…을 λ„μž…ν•˜λ €λŠ” 경우, 이름 속성에 μ‰Όν‘œ (,), μ„Έλ―Έμ½œλ‘  (;) λ˜λŠ” 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
Spring 3.1 μ΄μ „μ˜ λ²„μ „μ—μ„œ 역사적 기둝으둜 id 속성은 κ°€λŠ₯ν•œ 문자λ₯Ό μ œν•œν•˜λŠ” xsd : ID μœ ν˜•μœΌλ‘œ μ •μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
3.1λΆ€ν„°λŠ” xsd : string μœ ν˜•μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€.
bean id κ³ μœ μ„±μ€ μ—¬μ „νžˆ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μ‹œν–‰λ˜μ§€λ§Œ XML νŒŒμ„œλŠ” 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΉˆμ— λŒ€ν•œ μ΄λ¦„μ΄λ‚˜ IDλ₯Ό 제곡 ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.
μ΄λ¦„μ΄λ‚˜ IDκ°€ λͺ…μ‹œ 적으둜 μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ μ»¨ν…Œμ΄λ„ˆλŠ” ν•΄λ‹Ή bean에 λŒ€ν•΄ 고유 ν•œ 이름을 μƒμ„±ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ ref μš”μ†Œ λ‚˜ Service Locator μŠ€νƒ€μΌ 쑰회λ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄λ¦„μœΌλ‘œ λΉˆμ„ μ°Έμ‘°ν•˜λ €λŠ” 경우 이름을 μ œκ³΅ν•΄μ•Όν•©λ‹ˆλ‹€.
이름을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ” λ™κΈ°ν™”λŠ” λ‚΄λΆ€ λΉˆμ„ μ‚¬μš©ν•˜κ³  곡동 μž‘μ—…μžλ₯Ό autowiringν•˜λŠ” 것과 κ΄€λ ¨λ©λ‹ˆλ‹€. Β 

빈 λͺ…λͺ… κ·œμΉ™

κ΄€λ‘€λŠ” λΉˆμ„ λͺ…λͺ… ν•  λ•Œ μΈμŠ€ν„΄μŠ€ 이름과 같은 ν‘œμ€€ Java κ·œμΉ™μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
즉, 빈 이름은 μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•˜κ³  μ΄ν›„λ‘œ camel-casedλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. Β  μ΄λŸ¬ν•œ μ΄λ¦„μ˜ μ˜ˆλŠ” (λ”°μ˜΄ν‘œ μ œμ™Έ) 'accountManager', 'accountService', 'userDao', 'loginController'λ“±μž…λ‹ˆλ‹€.

Bean의 이름을 계속 μ§€μ •ν•˜λ©΄ ꡬ성을보닀 μ‰½κ²Œ 읽고 이해할 수 있으며
Spring AOPλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 이름과 κ΄€λ ¨λœ 콩 μ„ΈνŠΈμ— 쑰언을 적용 ν•  λ•Œ λ§Žμ€ λ„μ›€μ΄λ©λ‹ˆλ‹€.

Bean μ •μ˜ μ™ΈλΆ€μ—μ„œ Bean 별λͺ… 지정
Bean μ •μ˜ μžμ²΄μ—μ„œ, id μ†μ„±μœΌλ‘œ μ§€μ •λœ ν•˜λ‚˜μ˜ 이름과 name μ†μ„±μ˜ λ‹€λ₯Έ μ΄λ¦„μ˜ 쑰합을 μ‚¬μš©ν•˜μ—¬
Bean에 λ‘˜ μ΄μƒμ˜ 이름을 제곡 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이 이름은 λ™μΌν•œ Bean에 λŒ€ν•œ λ™λ“±ν•œ 별λͺ…이 될 수 있으며,
μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ 각 ꡬ성 μš”μ†Œκ°€ ν•΄λ‹Ή ꡬ성 μš”μ†Œ μžμ²΄μ— 고유 ν•œ bean 이름을 μ‚¬μš©ν•˜μ—¬
곡톡 쒅속성을 μ°Έμ‘°ν•˜λ„λ‘ ν—ˆμš©ν•˜λŠ” 것과 같은 일뢀 상황에 μœ μš©ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ bean이 μ‹€μ œλ‘œ μ •μ˜ 된 λͺ¨λ“  별λͺ…을 μ§€μ •ν•˜λŠ” 것이 항상 μ μ ˆν•œ 것은 μ•„λ‹™λ‹ˆλ‹€.
λ•Œλ‘œλŠ” λ‹€λ₯Έ 곳에 μ •μ˜ 된 bean에 λŒ€ν•œ 별λͺ…을 μ†Œκ°œν•˜λŠ” 것이 λ°”λžŒμ§ν•©λ‹ˆλ‹€.
μ΄λŠ” λŒ€κ°œ ꡬ성이 각 μ„œλΈŒ μ‹œμŠ€ν…œ μ‚¬μ΄μ—μ„œ λΆ„ν• λ˜λŠ” λŒ€ν˜• μ‹œμŠ€ν…œμ—μ„œ 각 μ„œλΈŒ μ‹œμŠ€ν…œλ§ˆλ‹€ 고유 ν•œ 였브젝트 μ •μ˜ μ„ΈνŠΈλ₯Ό κ°–λŠ” κ²½μš°μž…λ‹ˆλ‹€. ? XML 기반 ꡬ성 메타 λ°μ΄ν„°μ—μ„œ μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬μ΄λ₯Ό μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<alias name="fromName" alias="toName"/>

이 경우, fromNameμ΄λΌλŠ” μ΄λ¦„μ˜ λ™μΌν•œ μ»¨ν…Œμ΄λ„ˆμ—μžˆλŠ” bean은 이 별λͺ… μ •μ˜ μ‚¬μš© ν›„ toName으둜 μ°Έμ‘° 될 수 μžˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, μ„œλΈŒ μ‹œμŠ€ν…œ A의 ꡬ성 메타 λ°μ΄ν„°λŠ” subsystemA-dataSourceλΌλŠ” μ΄λ¦„μœΌλ‘œ DataSourceλ₯Ό μ°Έμ‘° ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ„œλΈŒ μ‹œμŠ€ν…œ B의 ꡬ성 메타 λ°μ΄ν„°λŠ” subsystemB-dataSourceλΌλŠ” μ΄λ¦„μœΌλ‘œ DataSourceλ₯Ό μ°Έμ‘° ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이 두 μ„œλΈŒ μ‹œμŠ€ν…œμ„ λͺ¨λ‘ μ‚¬μš©ν•˜λŠ” μ£Ό μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ
μ£Ό μ‘μš© ν”„λ‘œκ·Έλž¨μ€ myApp-dataSourceλΌλŠ” μ΄λ¦„μœΌλ‘œ DataSourceλ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.
μ„Έ 개의 이름 λͺ¨λ‘κ°€ MyApp ꡬ성 메타 데이터에 μΆ”κ°€ν•˜λŠ” λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°ν•˜κ²Œν•˜λ €λ©΄ λ‹€μŒ 별칭 μ •μ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />

이제 각 ꡬ성 μš”μ†Œμ™€ κΈ°λ³Έ μ‘μš© ν”„λ‘œκ·Έλž¨μ€ κ³ μœ ν•˜κ³  λ‹€λ₯Έ μ •μ˜μ™€ μΆ©λŒν•˜μ§€ μ•Šλ„λ‘ 보μž₯ 된
이름을 μ‚¬μš©ν•˜μ—¬ dataSourceλ₯Ό μ°Έμ‘° ν•  수 μžˆμ§€λ§Œ μ‹€μ œλ‘œ λ™μΌν•œ bean을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

μžλ°” 섀정을 μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄, @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 별λͺ…을 제곡 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μžμ„Έν•œ λ‚΄μš©μ€ @Bean μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©ν•˜κΈ°λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

1.3.2. Instantiating beans

beanμΈμŠ€ν„΄μŠ€ν™”
bean μ •μ˜λŠ” 본질적으둜 ν•˜λ‚˜ μ΄μƒμ˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
μ»¨ν…Œμ΄λ„ˆλŠ” 물을 λ•Œ λͺ…λͺ… 된 bean에 λŒ€ν•œ λ ˆμ„œν”Όλ₯Όλ³΄κ³ ,
κ·Έ bean μ •μ˜λ‘œ μΊ‘μŠν™” 된 μ„€μ • 메타 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€μ œ 객체λ₯Ό 생성 (λ˜λŠ” νšλ“)ν•©λ‹ˆλ‹€.

XML 기반 ꡬ성 메타 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 <bean /> μš”μ†Œμ˜ class μ†μ„±μ—μ„œ μΈμŠ€ν„΄μŠ€ν™” ν•  객체의 μœ ν˜• (λ˜λŠ” 클래슀)을 μ§€μ •ν•©λ‹ˆλ‹€.
λ‚΄λΆ€μ μœΌλ‘œ BeanDefinition μΈμŠ€ν„΄μŠ€μ˜ Class 속성 인이 클래슀 속성은 λŒ€κ°œ ν•„μˆ˜μž…λ‹ˆλ‹€.
(μ˜ˆμ™Έμ— λŒ€ν•΄μ„œλŠ” μΈμŠ€ν„΄μŠ€ νŒ©ν† λ¦¬ λ©”μ„œλ“œ 및 Bean μ •μ˜ 상속을 μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ν™”λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.)
λ‹€μŒ 두 가지 방법 쀑 ν•˜λ‚˜λ‘œ Class 속성을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  • 일반적으둜 μ»¨ν…Œμ΄λ„ˆ μžμ²΄κ°€ ν•΄λ‹Ή μƒμ„±μžλ₯Ό λ°˜μ˜ν•˜μ—¬ bean을 직접 μƒμ„±ν•˜λŠ” κ²½μš°μ—
    생성 될 bean 클래슀λ₯Ό μ§€μ •ν•˜λŠ” 것은 new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” Java μ½”λ“œμ™€ λ‹€μ†Œ λ™μΌν•©λ‹ˆλ‹€.
  • λ“œλ¬Έ κ²½μš°μ΄μ§€λ§Œ μ»¨ν…Œμ΄λ„ˆκ°€ λΉˆμ„ μƒμ„±ν•˜κΈ° μœ„ν•΄ 클래슀의 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 경우,
    객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ 호좜 될 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μ‹€μ œ 클래슀λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
    static νŒ©ν† λ¦¬ λ©”μ†Œλ“œμ˜ ν˜ΈμΆœλ‘œλΆ€ν„° 돌렀 주어진 였브젝트 ν˜•μ€, 같은 클래슀 λ˜λŠ” λ‹€λ₯Έ 클래슀 일 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

com.example νŒ¨ν‚€μ§€μ— FooλΌλŠ” ν΄λž˜μŠ€κ°€ 있고
이 Foo ν΄λž˜μŠ€μ— BarλΌλŠ” 정적 쀑첩 ν΄λž˜μŠ€κ°€μžˆλŠ” 경우 Bean μ •μ˜μ˜ 'class'속성 값은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
com.example.Foo$Bar 이름에 $ 문자λ₯Ό μ‚¬μš©ν•˜μ—¬ 쀑첩 클래슀 이름을 μ™ΈλΆ€ 클래슀 이름과 κ΅¬λΆ„ν•©λ‹ˆλ‹€.

Instantiation with a constructor

μƒμ„±μžλ‘œ μΈμŠ€ν„΄μŠ€ν™” ν•˜κΈ°
μƒμ„±μž μ ‘κ·Όλ²•μœΌλ‘œ λΉˆμ„ μƒμ„±ν•˜λ©΄, λͺ¨λ“  일반 ν΄λž˜μŠ€λŠ” Spring에 μ˜ν•΄ μ‚¬μš© κ°€λŠ₯ν•˜κ³  ν˜Έν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.
즉, κ°œλ°œμ€‘μΈ ν΄λž˜μŠ€λŠ” νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ νŠΉμ • λ°©μ‹μœΌλ‘œ μ½”λ”© ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
κ°„λ‹¨νžˆ bean 클래슀λ₯Ό μ§€μ •ν•˜λ©΄ μΆ©λΆ„ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ νŠΉμ • bean에 λŒ€ν•΄ μ‚¬μš©ν•˜λŠ” IoC μœ ν˜•μ— 따라 κΈ°λ³Έ (λΉ„μ–΄μžˆλŠ”) μƒμ„±μžκ°€ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Spring IoC μ»¨ν…Œμ΄λ„ˆλŠ” κ΄€λ¦¬ν•˜κ³ μžν•˜λŠ” 클래슀λ₯Ό 사싀상 관리 ν•  μˆ˜μžˆλ‹€.
μ§„μ •ν•œ JavaBeans 관리에 κ΅­ν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λŒ€λΆ€λΆ„μ˜ Spring μ‚¬μš©μžλŠ” κΈ°λ³Έ (인수 μ—†μŒ) μƒμ„±μžμ™€ μ μ ˆν•œ setter 및 getterλ₯Ό
μ»¨ν…Œμ΄λ„ˆμ˜ 속성 λ‹€μŒμ— λͺ¨λΈλ§ ν•œ μ‹€μ œ JavaBeansλ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€.
μ»¨ν…Œμ΄λ„ˆμ— 더 λ§Žμ€ non-bean-style 클래슀λ₯Ό κ°€μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, μ ˆλŒ€μ μœΌλ‘œ JavaBean μŠ€νŽ™μ„ λ”°λ₯΄μ§€ μ•ŠλŠ” λ ˆκ±°μ‹œ μ—°κ²° 풀을 μ‚¬μš©ν•΄μ•Όν•˜λŠ” 경우,
Spring도이λ₯Ό 관리 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

XML 기반 ꡬ성 메타 데이터λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 Bean 클래슀λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

<bean id="exampleBean" class="examples.ExampleBean"/>

<bean name="anotherExample" class="examples.ExampleBeanTwo"/>

μƒμ„±μžμ— 인수λ₯Ό μ œκ³΅ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜ (ν•„μš”ν•œ 경우) 및 객체가 생성 된 후에
객체 μΈμŠ€ν„΄μŠ€ 속성을 μ„€μ •ν•˜λŠ” 방법에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ Injection Dependenciesλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

Instantiation with a static factory method

정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ‘œ μΈμŠ€ν„΄μŠ€ν™”ν•˜κΈ°
정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ‘œ μž‘μ„±ν•œ bean을 μ •μ˜ ν•  λ•Œ,
class 속성을 μ‚¬μš©ν•˜μ—¬ 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀λ₯Ό μ§€μ •ν•˜κ³ 
factory-methodλΌλŠ” 속성을 μ‚¬μš©ν•˜μ—¬ νŒ©ν† λ¦¬ λ©”μ†Œλ“œ 자체의 이름을 μ§€μ •ν•˜μ‹­μ‹œμ˜€.

이 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  (λ‚˜μ€‘μ— μ„€λͺ… 된 선택적 인수 μ‚¬μš©) 라이브 객체λ₯Ό λ°˜ν™˜ ν•  수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.
이 κ°μ²΄λŠ” 이후 μƒμ„±μžλ₯Ό 톡해 λ§Œλ“€μ–΄μ§„ κ²ƒμ²˜λŸΌ μ·¨κΈ‰λ©λ‹ˆλ‹€.
κ·ΈλŸ¬ν•œ bean μ •μ˜λ₯Ό μ‚¬μš©ν•˜λŠ” ν•œ κ°€μ§€λŠ” λ ˆκ±°μ‹œ μ½”λ“œμ—μ„œ 정적 νŒ©ν† λ¦¬λ₯Ό ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒ bean μ •μ˜λŠ” factory-methodλ₯Ό ν˜ΈμΆœν•˜μ—¬ bean을 μƒμ„±ν•˜λ„λ‘ μ§€μ •ν•©λ‹ˆλ‹€.
이 μ •μ˜λŠ” λ°˜ν™˜ 된 객체의 μœ ν˜• (클래슀)을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©° factory λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀 만 μ§€μ •ν•©λ‹ˆλ‹€.
이 μ˜ˆμ œμ—μ„œ createInstance () λ©”μ„œλ“œλŠ” 정적 λ©”μ„œλ“œ μ—¬μ•Όν•©λ‹ˆλ‹€.

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>
public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}

    public static ClientService createInstance() {
        return clientService;
    }
}

νŒ©ν† λ¦¬ λ©”μ†Œλ“œμ— 인수 (선택적)λ₯Ό μ œκ³΅ν•˜κ³  νŒ©ν† λ¦¬μ—μ„œ μ˜€λΈŒμ νŠΈκ°€ 리턴 된 ν›„
였브젝트 μΈμŠ€ν„΄μŠ€ 등둝 정보λ₯Ό μ„€μ •ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 쒅속성 및 ꡬ성을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

Instantiation using an instance factory method

μΈμŠ€ν„΄μŠ€ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œ μΈμŠ€ν„΄μŠ€ν™”
정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό ν†΅ν•œ μΈμŠ€ν„΄μŠ€ν™”μ™€ μœ μ‚¬ν•˜κ²Œ, μΈμŠ€ν„΄μŠ€ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œ μΈμŠ€ν„΄μŠ€ν™”λŠ”
μ»¨ν…Œμ΄λ„ˆμ—μ„œ κΈ°μ‘΄ 빈의 λΉ„ 정적 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒˆ λΉˆμ„ μž‘μ„±ν•©λ‹ˆλ‹€.
이 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜λ €λ©΄ class 속성을 κ³΅λ°±μœΌλ‘œλ‘κ³  factory-bean μ†μ„±μ—μ„œ
객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ 호좜 ν•  μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œκ°€ 포함 된 ν˜„μž¬ (λ˜λŠ” μƒμœ„ / 쑰상) μ»¨ν…Œμ΄λ„ˆμ—μ„œ bean의 이름을 μ§€μ •ν•˜μ‹­μ‹œμ˜€.
νŒ©ν† λ¦¬ λ©”μ†Œλ“œ 자체의 이름을 factory-method μ†μ„±μœΌλ‘œ μ„€μ •ν•˜μ‹­μ‹œμ˜€.

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- inject any dependencies required by this locator bean -->
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>
public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();

    public ClientService createClientServiceInstance() {
        return clientService;
    }
}

ν•˜λ‚˜μ˜ νŒ©ν† λ¦¬ ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 ν•˜λ‚˜ μ΄μƒμ˜ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- inject any dependencies required by this locator bean -->
</bean>

<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>

<bean id="accountService"
    factory-bean="serviceLocator"
    factory-method="createAccountServiceInstance"/>
public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();

    private static AccountService accountService = new AccountServiceImpl();

    public ClientService createClientServiceInstance() {
        return clientService;
    }

    public AccountService createAccountServiceInstance() {
        return accountService;
    }
}

이 접근법은 factory bean μžμ²΄κ°€ μ˜μ‘΄μ„± μ£Όμž… (DI)을 톡해 κ΄€λ¦¬λ˜κ³  ꡬ성 될 수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.
factory bean은 μΈμŠ€ν„΄μŠ€ λ˜λŠ” 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό 톡해 객체λ₯Ό 생성 ν•  Spring μ»¨ν…Œμ΄λ„ˆμ— κ΅¬μ„±λœ bean을 μ°Έμ‘°ν•©λ‹ˆλ‹€.
λ°˜λŒ€λ‘œ, FactoryBean (λŒ€λ¬Έμž μ‚¬μš©μ—μ£Όμ˜)은 Spring κ΄€λ ¨ FactoryBean을 μ°Έμ‘°ν•©λ‹ˆλ‹€.