본문 바로가기

웹 프로그래밍/Spring

[Spring] DI 생성자 주입 <constructor-arg>, 속성 주입(세터 주입) <property> 분석

constructor-arg : 생성자 주입

- 생성자의 매개변수 개수 만큼 <constructor-arg> 태그를 생성한다.

- 즉, 매개변수가 있는 생성자를 만들 때 사용한다.

 

property : 속성 주입(세터 주입)

- 매개변수가 없는 생성자로 객체를 만든다.

- 이후 세터메소드를 작동시켜 멤버변수를 변경한다.

 

 

constructor-arg + property 

- <constructor-arg> 태그 개수만큼 매개변수를 가지고 있는 생성자로 객체를 우선 생성한다.

- 이후 propety 태그의 설정에 따라 세터 메소드가 실행된다.

 


퀴즈 : bean 태그의 하위 태그 개수를 보고 생성자 매개변수 개수를 알 수 있을까?

<constructor-arg> 태그인 경우에는 알 수 있다. 

 

아래의 myCalculator 빈은 3개의 매개변수를 가진다. 순서는 index로 준다.

- ref : 객체

- value : 정수값, (문자열은 어떻게 취급되려나?)

 

 

 


Calculator.java

package di.test01;

public class Calculator {

	public void addition(int firstNum, int secondNum) {
		System.out.printf("덧셈결과 : %d + %d = %d\n", firstNum, secondNum, (firstNum + secondNum));
	}
	
	public void substration(int firstNum, int secondNum) {
		System.out.printf("뺄셈결과 : %d - %d = %d\n", firstNum, secondNum, (firstNum - secondNum));
	}
	
	public void multiplication(int firstNum, int secondNum) {
		System.out.printf("곱셈결과 : %d * %d = %d\n", firstNum, secondNum, (firstNum * secondNum));
	}
	
	public void division(int firstNum, int secondNum) {
		System.out.printf("나눗셈결과 : %d - %d = %.2f\n", firstNum, secondNum, ((double)firstNum / secondNum));
	}
}

MyCalculator.java

package di.test01;

public class MyCalculator {

	private int firstNum;
	private int secondNum;
	private Calculator calculator;
		
	public MyCalculator() {
	}
	
	public MyCalculator(Calculator calculator) {
		super();
		this.calculator = calculator;
	}

	public MyCalculator(int firstNum, int secondNum, Calculator calculator) {
		super();
		this.firstNum = firstNum;
		this.secondNum = secondNum;
		this.calculator = calculator;
	}

	public void setFirstNum(int firstNum) {
		this.firstNum = firstNum;
	}

	public void setSecondNum(int secondNum) {
		this.secondNum = secondNum;
	}

	public void setCalculator(Calculator calculator) {
		this.calculator = calculator;
	}

	public void add() {
		calculator.addition(firstNum, secondNum);
	}
	
	public void sub() {
		calculator.substration(firstNum, secondNum);
	}
	
	public void mul() {
		calculator.multiplication(firstNum, secondNum);
	}
	
	public void div() {
		calculator.division(firstNum, secondNum);
	}
}

DITestMain.java

package di.test01;

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

public class DITestMain {

	public static void main(String[] args) {
		
		ApplicationContext container = new GenericXmlApplicationContext("ditest01/beanContainer.xml");
		
		/*
		Calculator c = new Calculator();
		MyCalculator my = new MyCalculator(c);
		*/
		
		MyCalculator my = (MyCalculator)container.getBean("myCal");
		
		
		my.setFirstNum(15);
		my.setSecondNum(4);
		
		my.add();
		my.sub();
		my.mul();
		my.div();
		
	}
}

beanContainer.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 class="di.test01.Calculator" id="cal" />	   					   
	<bean class="di.test01.MyCalculator" id="myCal">
		<constructor-arg ref="cal" />
	</bean>
</beans>

=> 생성자 주입 방식을 쓴다.

=> 그런데, 생성자의 매개변수가 1개이다. 그리고 그 매개변수는 바로 id가 cal인 Calculator 객체이다.

 

 

DITestMain2.java

package di.test01;

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

public class DITestMain02 {

	public static void main(String[] args) {
		
		ApplicationContext container = new GenericXmlApplicationContext("ditest01/beanContainer2.xml");
		
		//MyCalculator my = new MyCalculator(15, 4, new Calculator());
		MyCalculator my = container.getBean("myCal", MyCalculator.class);
		
		my.add();
		my.sub();
		my.mul();
		my.div();
		
	}
}

 

beanContainer2.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 class="di.test01.Calculator" id="cal" />	   					   
	<bean class="di.test01.MyCalculator" id="myCal">
		<constructor-arg ref="cal" index="2"/>
		<constructor-arg value="15" index="0" />
		<constructor-arg index="1">
			<value>4</value>
		</constructor-arg>
	</bean>
</beans>

=> 생성자 주입 방식이다.

=> 그리고 매개변수는 4개가 전달된다.

=> index를 통해 매개변수의 순서를 정할 수 있다.

=> 전달되는 매개변수가 객체인 경우에는 ref 속성을 쓴다.

=> 이외에 상수값을 넘길 때는 value 속성을 쓴다.

=> value 속성을 쓰는 방식은 두 가지다. 위에서 value 15, value 4가 각각 다른 방식이다.

 

 

DITestMain3.java

package di.test01;

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

public class DITestMain03 {

	public static void main(String[] args) {
		
		ApplicationContext container = new GenericXmlApplicationContext("ditest01/beanContainer3.xml");
		
		/*
		Calculator c = new Calculator();
		MyCalculator my = new MyCalculator(c);
		my.setFirstNum(15);
		my.setSecondNum(4);
		*/

		MyCalculator my = (MyCalculator)container.getBean("myCal");
		
		my.add();
		my.sub();
		my.mul();
		my.div();
		
	}
}

 

beanContainer3.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 class="di.test01.Calculator" id="cal" />	   					   
	<bean class="di.test01.MyCalculator" id="myCal">
		<constructor-arg ref="cal" />
		<property name="firstNum" value="15" />
		<property name="secondNum">
			<value>4</value>
		</property>
	</bean>
</beans>

=> 생성자 주입, 속성 주입(세터 주입)을 같이 쓸 수도 있다.

=> id가 cal인 객체를 생성자에 매개변수로 전달하여 객체를 만든다.

=> 이후 세터 주입으로 setFirstNum(), setSecondNum()을 찾아서 value 값에 맞게 설정한다.

=> 작업 순서에 대한 테스트 완료함.

=> 생성자로 객체 생성되는 즉시 firstNum과 secondNum을 찍어봤는데, 초기값 0이 나왔다. 즉, 객체가 만들어지고 난 뒤에 세터 주입으로 firstNum이 15, secondNum이 4가 되는 것임.

 

 

DITestMain4.java

package di.test01;

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

public class DITestMain04 {

	public static void main(String[] args) {
		
		ApplicationContext container = new GenericXmlApplicationContext("ditest01/beanContainer4.xml");
		
		/*
		Calculator c = new Calculator();
		MyCalculator my = new MyCalculator();
		my.setCalculator(c);
		my.setFirstNum(15);
		my.setSecondNum(4);
		*/

		MyCalculator my = (MyCalculator)container.getBean("myCal");
		
		my.add();
		my.sub();
		my.mul();
		my.div();
		
	}
}

beanContainer4.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 class="di.test01.Calculator" id="cal" />	   					   
	<bean class="di.test01.MyCalculator" id="myCal">
		<property name="calculator" ref="cal" />
		<property name="firstNum" value="15" />
		<property name="secondNum">
			<value>4</value>
		</property>
	</bean>
</beans>

=> 매개변수가 없는 생성자로 객체를 생성한 뒤에, 

=> 세터 주입으로 calculator 객체, firstNum, secondNum을 설정함.