Spring - 빈 객체 값 주입(생성자)

2020. 8. 17. 13:41Java/Spring

반응형

의존성 주입(Dependency Injection)

 

 - 의존성 주입은 Spring에서 아주 중요한 개념이자 장점이다.

 - Bean 객체를 생성할 때 Bean 객체가 관리할 값이나 객체를 주입하는 것을 의미한다.

 - Bean 객체 생성 후 Bean 객체가 가질 기본 값을 자바 코드로 설정하는 것이 아닌 Bean을 정의하는 xml 코드에서 정의하는 개념이다.

 

 

Bean을 정의할 때 constructor-arg 태그를 이용해 주입하게 되면 생성자를 통해 주입할 수 있다.

 

 

다음과 같은 TestBean1 클래스에 여러가지 매개변수를 받는 생성자들이 선언되어있다.

beans.xml 파일을 사용하여 생성자를 통해 값을 주입해보자.

public class TestBean1 {
	
	private int a;
	private double b;
	private String s;
	private DataBean d;
	
	public TestBean1(){
		System.out.println("TestBean1의 생성자");
	}
	
	public TestBean1(int a){
		System.out.println("TestBean1의 생성자 매개변수 int 1개 : "+a);
		this.a = a;
	}
	public TestBean1(double b){
		System.out.println("TestBean1의 생성자 매개변수 double 1개 : "+b);
		this.b = b;
	}
	public TestBean1(String s){
		System.out.println("TestBean1의 생성자 매개변수 String 1개 : "+s);
		this.s = s;
	}
	public TestBean1(DataBean d){
		System.out.println("TestBean1의 생성자 매개변수 Object 1개 : "+d);
		this.d = d;
	}
	
	public TestBean1(String s,int a,double b){
		System.out.println("TestBean1의 생성자 매개변수 3개 : "+s+","+a+","+b);
		this.s = s;
		this.a = a;
		this.b = b;
	}
	
	public void PrintData() {
		System.out.println("a  => "+a);
		System.out.println("b  => "+b);
		System.out.println("s  => "+s);
		System.out.println("d  => "+d);
	}
}

 

기본적인 매개변수 1개의 생성자를 넣는 방법이다.

constructor-arg 태그를 이용해 값을 넣고 type에는 자료형을 정해준다.

만약 type를 설정하지 않으면 String -> 실수 -> 정수의 우선순위로 생성자를 찾는다.

<bean id='t2' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="int"/>
</bean>

즉, 위 코드에서 type가 없으면

public TestBean1(String s){
		System.out.println("TestBean1의 생성자 매개변수 String 1개 : "+s);
		this.s = s;
	}

이 생성자가 실행된다. 만약 이 생성자가 없을 경우 매개변수의 자료형이 double인 생성자가 실행된다.

 

다음과 같이 매개변수의 자료형을 type로 설정하여 생성자에 값을 넣어준다.

<bean id='t2' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="int"/>
</bean>
	
<bean id='t3' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="double"/>
</bean>
	
<bean id='t4' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="String"/>
</bean>

 

매개변수의 값이 여러개일 경우는 constructor-arg 태그를 그 수에 맞게 선언한다.

 

public TestBean1(String s,int a,double b){
		System.out.println("TestBean1의 생성자 매개변수 3개 : "+s+","+a+","+b);
		this.s = s;
		this.a = a;
		this.b = b;
	}
<bean id='t5' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="스트링"/>
	<constructor-arg value="900" />
	<constructor-arg value="100" />
</bean>

이때, 매개변수의 순서와 주입할 자료의 순서가 같아야 한다.

 

이 순서를 index로 줄 수 있다.

<bean id='t6' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="900" index="2"/>
	<constructor-arg value="100" index="1"/>
	<constructor-arg value="스트링" index="0"/>
</bean>

위와 같이 index로 선언하면 index=0 의 value가 첫 매개변수의 값으로, index=1의 value가 두 번째 매개변수의 값으로 주입이 된다.

 

 

객체 또한 주입이 가능하다.

public TestBean1(DataBean d){
	System.out.println("TestBean1의 생성자 매개변수 Object 1개 : "+d);
	this.d = d;
}

 

beans.xml에 해당하는 객체의 빈 태그를 선언하고, 그 id 값을 constructor-arg 태그의 ref 속성으로 가져와서 적용한다.

<bean id="new" class="kr.co.softcampus.beans.DataBean"/>
	
<bean id='t7' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
<constructor-arg ref="new"/>
</bean>

 

 

beans.xml 파일에 다음과 같이 추가하고, Mainclass를 실해한다.

	<bean id='t1' class='kr.co.softcampus.beans.TestBean1' lazy-init='true'/>
	<bean id='t2' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="int"/>
	</bean>
	
	<bean id='t3' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="double"/>
	</bean>
	
	<bean id='t4' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="100" type="String"/>
	</bean>
	
	<bean id='t5' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="스트링"/>
	<constructor-arg value="900" />
	<constructor-arg value="100" />
	</bean>
	
	<bean id='t6' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg value="900" index="2"/>
	<constructor-arg value="100" index="1"/>
	<constructor-arg value="스트링" index="0"/>
	</bean>
	
	<bean id="new" class="kr.co.softcampus.beans.DataBean"/>
	
	<bean id='t7' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="PrintData">
	<constructor-arg ref="new"/>
	</bean>

 

public class MainClass {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
		
		TestBean1 t1 = ctx.getBean("t1",TestBean1.class);
		System.out.println("=============================================================");
		TestBean1 t2 = ctx.getBean("t2",TestBean1.class);
		System.out.println("=============================================================");
		TestBean1 t3 = ctx.getBean("t3",TestBean1.class);
		System.out.println("=============================================================");
		TestBean1 t4 = ctx.getBean("t4",TestBean1.class);
		System.out.println("=============================================================");
		TestBean1 t5 = ctx.getBean("t5",TestBean1.class);
		System.out.println("=============================================================");
		TestBean1 t6 = ctx.getBean("t6",TestBean1.class);
		System.out.println("=============================================================");
		TestBean1 t7 = ctx.getBean("t7",TestBean1.class);
		System.out.println("=============================================================");
		ctx.close();

	}

}

모두 정상적으로 잘 주입이 된다.

 

.

.

.

 

- value : 기본 자료형 값과 문자열 값을 설정한다.

- ref : 객체를 설정한다.

- type : 저장할 값의 타입을 설정한다.

- index : 지정된 값을 주입할 생성자의 매개변수 인덱스 번호

반응형