- 이 글은 아래의 내용에서 이어지는 내용입니다.
# 의존성 주입 : DI(Dependency Injection) - Constructor DI 주입
- Spring 의존성 주입 중 생성자(Constructor)를 통한 방법.
# 수행 과제
- 학생들의 정보를 생성자(Constructor)방식을 통해서 주입하는 과정을 알아보도록 하겠습니다.
1. Package SetterDI , StudentTestBean.java , StudentData.java
생성자(Constructor) 생성
- 패키지 constructorDI는 Student에 관한 Bean을 생성한다.
- StudentTestBean.java는 학생의 이름, 학번, 학점 변수와 학생의 정보 객체을 가진다.
- StudentData.java는 학생의 정보 주소를 가진다.
package constructorDI;
public class StudentTestBean {
private String stuName; // 학생 이름
private int stuNum; // 학생 번호
private double stuGrade; // 학생 점수
private StudentData stuData;
// Constructor 방식 DI
public StudentTestBean(String stuName, int stuNum, double stuGrade, StudentData stuData) {
this.stuName = stuName;
this.stuNum = stuNum;
this.stuGrade = stuGrade;
this.stuData = stuData;
}
public String getStuName() {
return stuName;
}
public int getStuNum() {
return stuNum;
}
public double getStuGrade() {
return stuGrade;
}
public StudentData getStuData() {
return stuData;
}
}
package constructorDI;
public class StudentData {
private String address; // 학생주소
// constructor 방식 DI
public StudentData(String stuAddress) {
this.address = stuAddress;
}
public String getAddress() {
return address;
}
}
2. ConstructorBeans.xml (생성자 매개 변수 넣는법)
- index로 위치 지정.
- 생성자와 동일 순서로 매개변수 지정.
- 매개변수의 type 지정을 통한 지정.
<?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 값으로 객체를 불러올 거라 bean id 값을 부여하였습니다. -->
<!-- 자료형을 명시하지는 않는 경우, String > double > int 형으로 자리를 잡는다. -->
<!-- 자료형 명시를 통해서 매개변수의 위치를 잡아준다. -->
<bean id="stuTest1_1" class="constructorDI.StudentTestBean"
lazy-init="true">
<constructor-arg value="이름1" type="java.lang.String"></constructor-arg>
<constructor-arg value="2.2" type="double"></constructor-arg>
<constructor-arg value="20501212" type="int"></constructor-arg>
<!-- studentData를 bean을 생성을 통해서 명시 -->
<constructor-arg index="3">
<bean class="constructorDI.StudentData">
<constructor-arg index="0" value="제주" type="java.lang.String"></constructor-arg>
</bean>
</constructor-arg>
</bean>
<!-- index 위치를 지정해주면서, 매개변 위치를 잡아준다. -->
<bean id="stuTest1_2" class="constructorDI.StudentTestBean"
lazy-init="true">
<constructor-arg index="2" value="2.2"></constructor-arg>
<constructor-arg index="0" value="이름1"></constructor-arg>
<constructor-arg index="1" value="20501212"></constructor-arg>
<!-- studentData를 bean을 생성을 통해서 명시 -->
<constructor-arg index="3">
<bean class="constructorDI.StudentData">
<constructor-arg index="0" value="제주" type="java.lang.String"></constructor-arg>
</bean>
</constructor-arg>
</bean>
<!-- 생성자의 들어가는 매개변수가 생성자와 동일하면 순서대로 명시하면 그대로 들어간다. -->
<bean id="stuTest2" class="constructorDI.StudentTestBean"
lazy-init="true">
<constructor-arg value="이름2"></constructor-arg>
<constructor-arg value="20501213"></constructor-arg>
<constructor-arg value="4.5"></constructor-arg>
<!-- studentData를 bean을 id를 참조를 통해서 명시 -->
<constructor-arg ref="stuBasicData"></constructor-arg>
</bean>
<!-- studentData의 기본형 -->
<bean id="stuBasicData" class="constructorDI.StudentData"
scope="prototype">
<constructor-arg type="java.lang.String" value="서울"></constructor-arg>
</bean>
</beans>
3. Main.java
package main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import constructorDI.StudentData;
import constructorDI.StudentTestBean;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("config/ConstructorBeans.xml");
System.out.println("--------------------------");
// getter를 통해서 setter을 통해서 주입한 데이터를 가져온다.
// student stuTest1 의 정보 출력
StudentTestBean stb1_1 = ctx.getBean("stuTest1_1", StudentTestBean.class);
System.out.println("stuTest1 name => " + stb1_1.getStuName());
System.out.println("stuTest1 num => " + stb1_1.getStuNum());
System.out.println("stuTest1 grade => " + stb1_1.getStuGrade());
System.out.println("stuTest1 address => " + stb1_1.getStuData().getAddress());
// 또는 StudentData stuData= stb1.getStuData(); stuData.getAddress(); 하는 방법도 있다.
System.out.println("--------------------------");
StudentTestBean stb1_2 = ctx.getBean("stuTest1_2", StudentTestBean.class);
System.out.println("stuTest1 name => " + stb1_2.getStuName());
System.out.println("stuTest1 num => " + stb1_2.getStuNum());
System.out.println("stuTest1 grade => " + stb1_2.getStuGrade());
System.out.println("stuTest1 address => " + stb1_2.getStuData().getAddress());
// 또는 StudentData stuData= stb1.getStuData(); stuData.getAddress(); 하는 방법도 있다.
System.out.println("--------------------------");
// student stuTest2 의 정보 출력
StudentTestBean stb2 = ctx.getBean("stuTest2", StudentTestBean.class);
System.out.println("stuTest2 name => " + stb2.getStuName());
System.out.println("stuTest2 num => " + stb2.getStuNum());
System.out.println("stuTest2 grade => " + stb2.getStuGrade());
System.out.println("stuTest2 address => " + stb2.getStuData().getAddress());
ctx.close();
System.out.println("--------------------------");
System.out.println("-ctx.close() 됨");
}
}
4. 실행결과.
'[Spring]' 카테고리의 다른 글
[Spring기초] @Autowried , @Qualifier의 이해 (0) | 2019.10.25 |
---|---|
[Spring기초] Java로 Bean 만들기.(Java로 xml 대신하기) (0) | 2019.10.20 |
[Spring기초] 의존성 주입:DI(Dependency Injection) - Setter DI (0) | 2019.10.13 |
[Spring기초] 모든 Bean이 생성 시 실행되는 메소드(BeanPostProcessor) - BeanLifeCycle (0) | 2019.10.12 |
[Spring기초] 모든 Bean 생성, 종료 메소드 실행(default-init-method, defalut-destroy-method) (0) | 2019.10.11 |