[constructor-arg를 통한 의존주입]
Student.java
public class Student { private String name; private String age; private String gradeNum; private String classNum; // 학생의 이름,나이,학년, 반을 담은 필드 값 public Student(String name, String age, String gradeNum, String classNum) { this.name = name; // '생성자'라는 것을 유심히 보자. this.age = age; this.gradeNum = gradeNum; this.classNum = classNum; } public String getName() { // 필드 값에 따른 setter, getter 정의 return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getGradeNum() { return gradeNum; } public void setGradeNum(String gradeNum) { this.gradeNum = gradeNum; } public String getClassNum() { return classNum; } public void setClassNum(String classNum) { this.classNum = classNum; } } | cs |
*
별 다른 것은 없고 매개변수를 전부 받아서 초기화한 생성자에 주목
물론 setter가 있지만 생성자로부터 초기화한 상태이다.
필드 + 필드 전체가 담긴 생성자 + setter, getter 조합
StudentInfo.java
public class StudentInfo { private Student student; // Student를 참조하는 변수를 선언 public StudentInfo(Student student) { // 생성자 this.student = student; } public void setStudent(Student student) { // setter this.student = student; } public void getStudentInfo() { // getter if(student != null) { System.out.println("이름 : " + student.getName()); System.out.println("나이 : " + student.getAge()); System.out.println("학년 : " + student.getGradeNum()); System.out.println("반 : " + student.getClassNum()); System.out.println("========================"); } } } | cs |
*
student 변수 + 생성자 + setter, getter(getter에 학생정보) 조합
ctx_example01.xml
<?xml version="1.0" encoding="UTF-8"?> <bean id="student1" class="com.yul.ex03_example01.Student"> <constructor-arg value="yul"/> <constructor-arg value="10살"/> <constructor-arg value="3학년"/> <constructor-arg value="4반"/> </bean> <bean id="student2" class="com.yul.ex03_example01.Student"> <constructor-arg value="rim"/> <constructor-arg value="9살"/> <constructor-arg value="6학년"/> <constructor-arg value="8반"/> </bean> <bean id="studentInfo" class="com.yul.ex03_example01.StudentInfo"> <constructor-arg> <ref bean="student1"/> </constructor-arg> </bean> </beans> | cs |
*
우선 student를 어떻게 매핑하는지 주의 깊게 보자.
*
constructor-arg : 앞서 student의 '생성자'를 유심히 보라고 했다.
같은 클래스로부터 student1과 student2 두 개의 객체를 만들었는데
사실 student에 생성자와 setter 둘 다 명시되어 있어서 골라서 쓸 수 있지만
생성자를 택했고 생성자를 통해서 객체를 만들 경우 constructor-arg를 써야한다.
그리고 studentInfo에서 만든 생성자를 토대로 constructor-arg 값을 주고
여기서 중요한 점은 student1을 참조한다고 쓴다.
즉 studentInfo는 생성자를 호출하여 student1을 참조로 초기화한다.
★
constructor-arg는 매개변수가 있는 생성자를 호출하여 초기화 property는 매개변수가 없는 생성자 호출후 setter메서드를 호출하여 필드값을 초기화
MainClass.java
public class MainClass { public static void main(String[] args) { String configLocation = "classpath:ctx_example01.xml"; AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation); StudentInfo studentInfo = ctx.getBean("studentInfo", StudentInfo.class); studentInfo.getStudentInfo(); // 1 Student student2 = ctx.getBean("student2", Student.class); studentInfo.setStudent(student2); studentInfo.getStudentInfo(); // 2 ctx.close(); } } | cs |
*
1과 2가 어떻게 다른지 비교해보자.
//1
student1을 참고하고 있는 studentInfo를 뽑아와서
StudentInfo의 변수 studentInfo에 넣고 있고
getStudentInfo()를 통해 학생의 정보를 호출한다.
//2
student2 자체를 뽑아왔는데
기존 setter값을 다시 초기화하기 위해 student2를 넣는 것이다.
그 후 다시 똑같은 getStudentInfo()를 통해 학생의 정보를 호출하면 다른 값이 나온다.
Student - StudentInfo는 의존관계이다.
의존주입(DI)에는 두 가지 방법이 있다.
1. 생성자() : 생성자의 파라미터를 통해 - constructor-arg
2. setter() : setter를 통해 - property
왼쪽의 Student는 xml 파일을 통해 bean을 생성해서 주입한다.
오른쪽의 Student는 java파일 그 자체를 통해 주입할 수도 있다.
'프로그래밍 > Spring' 카테고리의 다른 글
Spring / DI 사용의 장점 (0) | 2018.04.07 |
---|---|
Spring / 직접 or 참조 DI설정 (0) | 2018.04.07 |
Spring / xml 매핑하기 (0) | 2018.04.07 |
Spring의 필요성 / Spring을 사용 했을 때 (0) | 2018.04.07 |
Spring의 필요성 / Spring을 사용하지 않을 때 (0) | 2018.04.07 |