Spring - 빈 객체 값 주입(자동주입)

2020. 8. 17. 22:38Java/Spring

반응형

- Spring에서는 객체를 주입할 때 자동으로 주입될 수 있도록 설정할 수 있다.

- 자동 주입은 이름, 타입, 생성자를 통할 수 있으며 auto wire라는 용어로 부른다.

 

 

다음과 같이 빈 클래스를 만든다.

1.기본 자동주입

public class TestBean4 {
	
	private DataBean data1;
	private DataBean data2;
	
	
	public DataBean getData1() {
		return data1;
	}
	public void setData1(DataBean data1) {
		this.data1 = data1;
	}
	public DataBean getData2() {
		return data2;
	}
	public void setData2(DataBean data2) {
		this.data2 = data2;
	}
	
	public void PrintData() {
		System.out.println("==============data1  =>"+ data1 + "===============data2  => "+ data2);
	}
	
	
}

원래의 객체 주입 방법은 아래와 같이 하였다.

<bean id="t18" class="kr.co.softcampus.beans.TestBean4" init-method="PrintData">
	<property name="data1" ref="TestBean4Bean"/>
	<property name="data2" ref="TestBean4Bean"/>
</bean>
	
<bean id="TestBean4Bean" class="kr.co.softcampus.beans.DataBean" scope="prototype"/>

자동 주입을 위해서는 autowire 속성을 설정한다.

<bean id="t19" class="kr.co.softcampus.beans.TestBean4" init-method="PrintData" autowire="byName" />

<bean id="data1" class="kr.co.softcampus.beans.DataBean"/>
<bean id="data2" class="kr.co.softcampus.beans.DataBean"/>

불러올 빈 객체를 선언하고, 그 id를 변수의 이름과 맞게 설정한다.

그리고 주입 할 클래스의 빈 객체의 autowire를 byName으로 설정하면 변수명과 id를 비교하여 값을 주입한다.

 

 

타입으로도 자동주입이 가능하다.

public class TestBean5 {
	
	private DataBean3 data1;
	private DataBean4 data2;
		
	public DataBean3 getData1() {
		return data1;
	}

	public void setData1(DataBean3 data1) {
		this.data1 = data1;
	}

	public DataBean4 getData2() {
		return data2;
	}

	public void setData2(DataBean4 data2) {
		this.data2 = data2;
	}

	public void PrintData() {
		System.out.println("==============data1  =>"+ data1 + "===============data2  => "+ data2);
	}
}

해당 클래스에서 알맞은 타입(형)의 빈을 찾아서 주입한다.

<bean id="t20" class="kr.co.softcampus.beans.TestBean5" init-method="PrintData" autowire="byType"/>

<bean class="kr.co.softcampus.beans.DataBean3"/>
<bean class="kr.co.softcampus.beans.DataBean4"/>

data1 에는 자동으로 

<bean class="kr.co.softcampus.beans.DataBean3"/> 

위의 빈 객체가 주입되고

 

data2 에는 

<bean class="kr.co.softcampus.beans.DataBean4"/

위의 빈 객체가 주입된다.

 

 

2.생성자를 통한 자동주입

 

생성자를 통해서도 자동 주입이 가능하다.

 

다양한 매개변수를 갖는 생성자를 오버로딩 하여 클래스를 만든다.

public class TestBean6 {
	private int data1;
	private String data2;
	private	DataBean3 data3;
	private DataBean3 data4;
	
	
	public TestBean6(DataBean3 data3,DataBean3 data4) {
		
		this.data3=data3;
		this.data4=data4;
	}
	
	public TestBean6(int data1,String data2,DataBean3 data3,DataBean3 data4) {
		this.data1=data1;
		this.data2=data2;
		this.data3=data3;
		this.data4=data4;
	}
	
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public String getData2() {
		return data2;
	}
	public void setData2(String data2) {
		this.data2 = data2;
	}
	public DataBean3 getData3() {
		return data3;
	}
	public void setData3(DataBean3 data3) {
		this.data3 = data3;
	}
	public DataBean3 getData4() {
		return data4;
	}
	public void setData4(DataBean3 data4) {
		this.data4 = data4;
	}
	
	public void PrintData() {
		System.out.println("data1=>"+data1+"  data2=> "+data2+"  data3=>"+data3+"  data4=> "+data4);
	}
	
	
}

생성자를 통한 수동 주입은 아래와 같이 하였다.

<bean id="t21" class="kr.co.softcampus.beans.TestBean6" init-method="PrintData">
	<constructor-arg ref="Data3" index="0"></constructor-arg>
	<constructor-arg ref="Data3" index="1"></constructor-arg>
</bean>
	
<bean id="t22" class="kr.co.softcampus.beans.TestBean6" init-method="PrintData">
    <constructor-arg value="100" index="0" />
    <constructor-arg value="Data3" index="1" />
    <constructor-arg ref="Data3" index="2"></constructor-arg>
    <constructor-arg ref="Data3" index="3"></constructor-arg>
</bean>

자동 주입은 객체만 가능하고 int나 String은 수동으로 주입을 해야한다.

 

<bean id="t23" class="kr.co.softcampus.beans.TestBean6" init-method="PrintData" autowire="constructor">
    <constructor-arg value="100" index="0" />
    <constructor-arg value="Data3" index="1" />
</bean>

위 처럼 문자열이나 자료형의 경우에는 수동으로 주입하고, autowire="constructor" 을 준다면 객체타입은 자동으로 주입된다.

 

 

만약 bean에 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.xsd"
	default-autowire="byName"
	>

 위 처럼 추가하면 autowire 가 없는 태그들은 byName을 따라서 자동주입이 된다.

 

만약 이 자동주입을 원하지 않는다면 

<bean id="t25" class="kr.co.softcampus.beans.TestBean4" init-method="PrintData" autowire="no"/>

위 태그처럼 autowire='no'를 해준다.

 

.

.

.

.

- byName : 빈 객체의 프로퍼티 이름과 정의된 빈의 이름이 같은 것을 찾아 자동으로 주입한다.

- byType : 빈 객체의 프로퍼티 타입과 정의된 빈의 타입이 일치할 경우 주입된다.

              (이 때, 동일 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생한다.)

 

- constructor : 생성자의 매개 변수 타입과 정의된 빈의 타입이 일치할 경우 주입된다.

                   (이 때, 동일 타입의 빈이 두 개 이상 정의되어 있으면 오류가 발생한다.)

 

반응형