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을 설정함.
'웹 프로그래밍 > Spring' 카테고리의 다른 글
[Spring] DI 실습(5) : Annotation을 이용한 SPRING 자동 주입-2 (0) | 2020.08.14 |
---|---|
[Spring] DI 실습(4) :Dependency 응용, 집합객체 설정 : list, map (0) | 2020.08.14 |
[Spring] DI 실습(3) : Annotation을 이용한 SPRING 자동 주입 (0) | 2020.08.13 |
[Spring] DI 실습(1) 의존관계일 때의 번거로운 상황 설명 : 생성자 주입, 속성 주입(setter injection)의 필요성 (0) | 2020.08.13 |
[Spring] bean, container 개념 및 예제 & 싱글턴 패턴 사용 방법 (0) | 2020.08.13 |