반응형
의존성 주입(Dependency Injection)
의존성 주입은 spring에서 아주 중요한 개념이자 장점입니다. Bean 객체를 생성할 떄 Bean 객체가 관리할 값이나 객체를 주입하는 것을 의미합니다. Bean 객체 생성 후 Bean 객체가 가질 기본 값을 자바 코드로 설정하는 것이 아닌 Bean을 정의하는 xml 코드에서 정의하는 개념입니다.
생성자를 통한 주입
Bean을 정의할 떄 constructor-arg 태그를 이용해 주입하게 되면 생성자를 통해 주입할 수 있습니다.
value : 기본 자료형 값과 문자열 값을 설정합니다.
ref : 객체를 설정합니다.
type : 저장할 값의 타입을 설정합니다.
index : 지정된 값을 주입할 생성자의 매개변수 인덱스 번호입니다.
beans.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 id='obj1' class='kr.co.softcampus.beans.TestBean' lazy-init='true'/>
<bean id='obj2' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
<constructor-arg value='100' type='int'/>
</bean>
<bean id='obj3' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
<constructor-arg value='11.11' type='double'/>
</bean>
<bean id='obj4' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
<constructor-arg value='문자열'/>
</bean>
<bean id='obj5' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
<constructor-arg value='200' type='int'/>
<constructor-arg value='22.22' type='double'/>
<constructor-arg value='안녕하세요' type='java.lang.String'/>
</bean>
<bean id='obj6' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
<constructor-arg value='반갑습니다' type='java.lang.String'/>
<constructor-arg value='300' type='int'/>
<constructor-arg value='33.33' type='double'/>
</bean>
<bean id='obj7' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
<constructor-arg value='44.44' type='double' index='1'/>
<constructor-arg value='44' type='int' index='0'/>
<constructor-arg value='안녕하세요' type='java.lang.String' index='2'/>
</bean>
<bean id='obj8' class='kr.co.softcampus.beans.TestBean2' lazy-init='true'>
<constructor-arg>
<bean class='kr.co.softcampus.beans.DataBean'/>
</constructor-arg>
<constructor-arg>
<bean class='kr.co.softcampus.beans.DataBean'/>
</constructor-arg>
</bean>
<bean id='data_bean' class='kr.co.softcampus.beans.DataBean' scope='prototype'/>
<bean id='obj9' class='kr.co.softcampus.beans.TestBean2' lazy-init='true'>
<constructor-arg ref='data_bean'/>
<constructor-arg ref='data_bean'/>
</bean>
</beans>
DataBean.java
package kr.co.softcampus.beans;
public class DataBean {
}
TestBean.java
package kr.co.softcampus.beans;
public class TestBean {
private int data1;
private double data2;
private String data3;
public TestBean() {
System.out.println("TestBean의 기본 생성자");
this.data1 = 0;
this.data2 = 0.0;
this.data3 = null;
}
public TestBean(int data1) {
System.out.println("TestBean의 생성자 : int 변수 1개");
this.data1 = data1;
this.data2 = 0.0;
this.data3 = null;
}
public TestBean(double data2) {
System.out.println("TestBean의 생성자 : double 변수 1개");
this.data1 = 0;
this.data2 = data2;
this.data3 = null;
}
public TestBean(String data3) {
System.out.println("TestBean의 생성자 : String 변수 1개");
this.data1 = 0;
this.data2 = 0.0;
this.data3 = data3;
}
public TestBean(int data1, double data2, String data3) {
System.out.println("TestBean의 생성자 : 변수 3개");
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
}
public void printData() {
System.out.printf("data1 : %d\n", data1);
System.out.printf("data2 : %f\n", data2);
System.out.printf("data3 : %s\n", data3);
}
}
TestBean2.java
package kr.co.softcampus.beans;
public class TestBean2 {
private DataBean data1;
private DataBean data2;
public TestBean2(DataBean data1, DataBean data2) {
this.data1 = data1;
this.data2 = data2;
}
public void printData() {
System.out.printf("data1 : %s\n", data1);
System.out.printf("data2 : %s\n", data2);
}
}
MainClass.java
package kr.co.softcampus.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.DataBean;
import kr.co.softcampus.beans.TestBean;
import kr.co.softcampus.beans.TestBean2;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
TestBean t1 = new TestBean();
t1.printData();
System.out.println("-------------------------");
TestBean t2 = new TestBean(100);
t2.printData();
System.out.println("--------------------------");
TestBean t3 = new TestBean(11.11);
t3.printData();
System.out.println("--------------------------");
TestBean t4 = new TestBean("문자열");
t4.printData();
System.out.println("--------------------------");
TestBean t5 = new TestBean(200, 22.22, "안녕하세요");
t5.printData();
System.out.println("--------------------------");
//TestBean t6 = new TestBean("반갑습니다", 300, 33.33);
//t6.printData();
System.out.println("--------------------------");
TestBean obj1 = ctx.getBean("obj1", TestBean.class);
obj1.printData();
System.out.println("--------------------------");
TestBean obj2 = ctx.getBean("obj2", TestBean.class);
obj2.printData();
System.out.println("--------------------------");
TestBean obj3 = ctx.getBean("obj3", TestBean.class);
obj3.printData();
System.out.println("--------------------------");
TestBean obj4 = ctx.getBean("obj4", TestBean.class);
obj4.printData();
System.out.println("--------------------------");
TestBean obj5 = ctx.getBean("obj5", TestBean.class);
obj5.printData();
System.out.println("--------------------------");
TestBean obj6 = ctx.getBean("obj6", TestBean.class);
obj6.printData();
System.out.println("--------------------------");
TestBean obj7 = ctx.getBean("obj7", TestBean.class);
obj7.printData();
System.out.println("-------------------------------");
DataBean d1 = new DataBean();
DataBean d2 = new DataBean();
TestBean2 t200 = new TestBean2(d1, d2);
t200.printData();
System.out.println("-------------------------------");
TestBean2 obj8 = ctx.getBean("obj8", TestBean2.class);
obj8.printData();
System.out.println("-------------------------------");
TestBean2 obj9 = ctx.getBean("obj9", TestBean2.class);
obj9.printData();
ctx.close();
}
}
bean에다가 지정해놓은 변수값을 넣어주어 의존성을 주입하는 예제를 진행해보았습니다. 의존성을 고정적으로 주입하는 과정을 통해, 유지보수성을 높일 수 있다는 것을 알게 되었습니다. 만약, 의존성 주입을 하지 않고 따로 직접 주입을 하여 개발을 한다면, 추후에 수정할 때는 해당 객체를 다 수정해야하고, 그 부분을 놓치게 된다면, 실수를 범할 수 있을 것이란 생각을 하게 되었습니다.
반응형
'SW > Java' 카테고리의 다른 글
Java : Spring : bean 컬렉션 주입 : 개념, 예제, 구현 (0) | 2020.06.10 |
---|---|
Java : Spring : Bean : Setter 메서드를 통한 의존성 주입 : 예제, 구현 (0) | 2020.04.29 |
Java : Spring : BeanPostProcessor : 개념, 방법, 예제, 구현 (0) | 2020.04.15 |
Java : Spring: Bean 생성, 소멸 시 메소드 호출 방법 : 예제, 구현 (0) | 2020.04.14 |
Java : Spring: bean : 객체 생성, 태그 : 개념, 예제, 구현 (0) | 2020.04.13 |