2020. 8. 17. 13:41ㆍJava/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 : 지정된 값을 주입할 생성자의 매개변수 인덱스 번호
'Java > Spring' 카테고리의 다른 글
Spring - 빈 객체 값 주입(컬렉션) (0) | 2020.08.17 |
---|---|
Spring - 빈 객체 값 주입 (Setter 메소드) (0) | 2020.08.17 |
Spring - BeanPostProcessor (0) | 2020.08.16 |
Spring - 빈 객체 생성 및 생명주기 (0) | 2020.08.16 |
Spring - IoC 컨테이너로 빈 관리하기 (0) | 2020.08.15 |