Joslynn의 하루

MSA Full-Stack 개발자 양성 과정 - Spring DI(Dependency Injection) Collection 형태 주입, ~.xml 문서, ~.properties 파일 사용, Autowire_221103 본문

MSA Full-Stack 개발자 양성과정/Spring

MSA Full-Stack 개발자 양성 과정 - Spring DI(Dependency Injection) Collection 형태 주입, ~.xml 문서, ~.properties 파일 사용, Autowire_221103

Joslynn 2022. 11. 3. 18:19

Dependency Injection

: Java class 내에서 생성자 또는 setter 필수

: xml 문서에서 <constructor - arg>  또는 <property> 태그 필수

 

여러 개의 property 태그를 사용할 경우

eclipse - configulation xml 문서의 Namespaces 선택

<!--xmlns:p="http://www.springframework.org/schema/p" 추가-->

	<bean class="sample06.Customer" id="cu2">
		<constructor-arg value="jang" /> <!-- 생성자 호출 -->
		<property name="age" value="30" /> <!-- setter 호출 -->
		<property name="addr" value="경기도 오리역"></property>
	</bean>

	<bean class="sample06.Customer" id="cu3" p:addr="제주도" p:age="25" p:id="kim" />

 

 

외부의 properties 파일을 사용한 DI 주입

customerInfo01.properties

configulation 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"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 외부의 properties 파일의 위치를 설정 -->
	<!--PropertySourcesPlaceholderConfigurer 클래스: properties 파일 위치 관리-->
	<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
		<property name="location">
			<value>classpath:sample06/customerInfo01.properties</value>
		</property>
	</bean>

	<!-- 외부의 properties 파일에 있는 key로 value 사용 -->
	<bean class="sample06.Customer" id="cu4" p:addr="${addr}" p:age="${age}" p:id="${id}" />

</beans>

 


여러 개의 properties 파일 사용

customerInfo02.properties

configulation 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"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 외부의 properties 파일의 위치를 설정 -->
	<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
		<property name="locations">
			<array> <!--배열 형태-->
				<value>classpath:sample06/customerInfo01.properties</value>
				<value>classpath:sample06/customerInfo02.properties</value>
			</array>
		</property>
	</bean>

	<!-- 외부의 properties 파일에 있는 key로 value 사용 -->
	<bean class="sample06.Customer" id="cu4" p:addr="${addr}" p:age="${age}" p:id="${id}" />
	<bean class="sample06.Customer" id="cu5" p:id="${cu.id}" p:age="${cu.age}" p:addr="${cu.addr}" />
</beans>

 

Context Namespace 사용 문서 설정)

<!-- 외부의 properties 파일의 위치를 설정 -->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <array> <!--배열 형태-->
            <value>classpath:sample06/customerInfo01.properties</value>
            <value>classpath:sample06/customerInfo02.properties</value>
        </array>
    </property>
</bean>

<!------------------------------------------------------------>
<!-- 위의 내용과 동일 -->
<context:property-placeholder 
        location="sample06/customerInfo01.properties, sample06/customerInfo02.properties"/>

Collection 주입 & 외부 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"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

<!-- 외부의 bean설정 문서 연결 -->
<import resource="classpath:sample06/springDIList01.xml"/>

	<!-- 컬렉션 객체 주입 -->
	<bean class="sample06.ListBean" id="listBean">
		<property name="intList">
			<list>
				<value>10</value>
				<value>20</value>
				<value>30</value>
				<value>40</value>
				<value>50</value>
			</list>
		</property>
		<property name="stringList">
			<list>
				<value>test01</value>
				<value>test02</value>
				<value>test03</value>
				<value>test04</value>
				<value>test05</value>
			</list>
		</property>
		<property name="customerList">
			<list>
				<ref bean="cu1"/>
				<ref bean="cu2"/>
				<ref bean="cu3"/>
				<ref bean="cu4"/>
				<ref bean="cu5"/>
				<bean class="sample06.Customer">
					<property name="id" value="hee"/>
					<property name="age" value="20"/>
					<property name="addr" value="전라도 여수시"/>
				</bean>
			</list>
		</property>
	</bean>

</beans>

 

main에서 호출)

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("sample06/springDIList02.xml");

		ListBean bean = context.getBean("listBean", ListBean.class);

		for (int i : bean.getIntList()) {
			System.out.println(i);
		}

		for (String str : bean.getStringList()) {
			System.out.println(str);
		}

		for (Customer c : bean.getCustomerList()) {
			System.out.println(c);
		}
	}

}

 


Autowire

: autoWire 속성을 이용해서 xml 문서 태그를 간소화, 필요한 의존 객체에 해당하는 빈을 자동 매핑해 주입

 

적용 방법

1) byType : type이 같은 객체를 찾아서 setXxx() 자동 호출 및 주입

                   동일 type으로 2개 이상의 객체가 존재할 경우, 예외 발생 (→동일 type 2개 이상일 경우 byName 사용)

2) byName : xml의 id와 java의 property(멤버변수) 이름이 동일한 객체를 찾아서 setXxx() 자동 호출 및 주입

                     동일한 id를 주지 않을 경우, 동일 객체를 찾지 못해 주입 불가

3) constructor : 생성자를 자동으로 호출

                           1)  우선, byType으로 찾고, 2) 동일한 type의 객체가 여러 개 있을 경우 byName으로 찾음 

                           byName은 xml의 id와 java의 생성자의 parameter이름과 동일해야 함

 

사용 예시)

<bean class="sample07.MemberVOController" id="controller" autowire="byType"/>
<bean class="sample07.MemberVOController" id="controller" autowire="byName"/>
<bean class="sample07.MemberVOController" id="controller" autowire="constructor"/>

 

 

Comments