본문 바로가기
프로그래밍/Spring

Spring / 직접 or 참조 DI설정

by 소소로드 2018. 4. 7.

[직접 or 참조 DI설정]


 

Student.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class Student {
    
    private String name;
    private String age;
    private ArrayList<String> hobbies;
    private double height;
    private double weight; // 학생 정보에 관한 필드 값
    
    private Student(String name, String age, ArrayList<String> hobbies) {
        this.name = name;
        this.age = age;
        this.hobbies = hobbies; // 그 중 name, age, hobbies만 생성자에 넣었다.
    }
 
    public String getName() { // getter, setter 지정
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getAge() {
        return age;
    }
 
    public void setAge(String age) {
        this.age = age;
    }
 
    public ArrayList<String> getHobbies() {
        return hobbies;
    }
 
    public void setHobbies(ArrayList<String> hobbies) {
        this.hobbies = hobbies;
    }
 
    public double getHeight() {
        return height;
    }
 
    public void setHeight(double height) {
        this.height = height;
    }
 
    public double getWeight() {
        return weight;
    }
 
    public void setWeight(double weight) {
        this.weight = weight;
    }    
}
cs

*

어렵지 않은 구조이다.

5개의 필드 값 선언 + 3개의 생성자 선언 + getter, setter 선언




StudentInfo.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class StudentInfo {
    
    private Student student; // student 변수 선언
 
    public Student getStudent() { // student 변수에 대한 getter
        return student;
    }
 
    public void setStudent(Student student) { // student 변수에 대한 setter
        this.student = student;
    }
    
    public void getStudentInfo() { // StudentInfo 변수에 대한 getter, 학생정보
        if(student != null) {
            System.out.println("이름 : " + student.getName());
            System.out.println("나이 : " + student.getAge());
            System.out.println("키 : " + student.getHeight());
            System.out.println("체중 : " + student.getWeight());
            System.out.println("-----------------------------------------");
            
        }
    }
 
}
cs

*

student에 대한 getter와 setter가 있을 뿐

StudentInfo에 관한건 getStudentInfo() 밖에 없다.




Family.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Family {
    
    public String papaName;
    public String mamaName;
    public String sisterName;
    public String brotherName; // 가족이름에 대한 필드값
    
    public Family(String papaName, String mamaName) {
        this.papaName = papaName;
        this.mamaName = mamaName; // 엄마, 아빠 이름만 생성자로 지정
    }
 
    public String getPapaName() { // getter, setter 지정
        return papaName;
    }
 
    public void setPapaName(String papaName) {
        this.papaName = papaName;
    }
 
    public String getMamaName() {
        return mamaName;
    }
 
    public void setMamaName(String mamaName) {
        this.mamaName = mamaName;
    }
 
    public String getSisterName() {
        return sisterName;
    }
 
    public void setSisterName(String sisterName) {
        this.sisterName = sisterName;
    }
 
    public String getBrotherName() {
        return brotherName;
    }
 
    public void setBrotherName(String brotherName) {
        this.brotherName = brotherName;
    }
}
cs

*

4개의 필드 값 + 2개의 생성자 + getter, setter 선언




appCTX_axample01.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<bean id="student1" class="com.yul.ex04_example01.Student">
    <constructor-arg value="yul"/>
    <constructor-arg value="100세"/>
    <constructor-arg>
        <list>
            <value>노래부르기</value>
            <value>테니스</value>
            <value>런닝</value>
        </list>
    </constructor-arg>
    <property name="height"  value="200"/>
    <property name="weight"  value="80"/>
</bean>
 
<bean id="StudentInfo1" class="com.yul.ex04_example01.StudentInfo">
    <property name="student">
        <ref bean="student1"/>
    </property>
</bean>
cs

*

student1 :   이제 bean 매핑은 어렵지 않은 일이다.

  Student 생성자에 name, age, hobbies만 생성되어 있으므로 차례대로 써주고

  hobbies는 <list>안에서 <value>로 묶는다.


나머지 height, weight는 setter로 생성해주고 있으므로

property로 묶어주면 된다.




StudentInfo1 : ★ 주목해야 할 부분


<property name="student">

<-->

public void setStudent(Student student) {

this.student = student;

}


- xml에서 매핑할 때, Student가 setter 생성되어 있으니 property로 해준다.




<ref bean="student1"/>

<-->

private Student student;


- xml에서 매핑할 때,  student1을 참조하여 초기화된다는 것을 꼭 기억하자.

 




appCTX_axample02.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<bean id="student3" class="com.yul.ex04_example01.Student">
    <constructor-arg value="rim"/>
    <constructor-arg value="120세"/>
    <constructor-arg>
        <list>
            <value>걷기</value>
            <value>바보 표정짓기</value>
            <value>춤추기</value>
        </list>
    </constructor-arg>
    <property name="height" value="187"/>
    <property name="weight" value="67"/>
</bean>
 
<bean id="family1" class="com.yul.ex04_example01.Family">
    <constructor-arg value="율아빠"/>
    <constructor-arg value="율엄마"/>
    <property name="sisterName" value="율언니"/>
    <property name="brotherName" value="율오빠"/>
</bean>
cs

*

student3부분은 student1부분 매핑과 똑같고 같은 클래스에서 객체 생성을 한 것 뿐이다.


family1부분도 그동안 계속 해온 부분과 같으므로 패스




MainClass.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MainClass {
 
    public static void main(String[] args) {
 
        String configLoc01 = "classpath:appCTX_example01.xml";
        String configLoc02 = "classpath:appCTX_example02.xml"; // xml 두개 선언
        
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc01, configLoc02);
// ctx의 한 공간에 confingLoc01, configLoc02를 같이 있다는 의미가 된다.  

        Student student1 = ctx.getBean("student1", Student.class);
        System.out.println("이름 : " + student1.getName());
        System.out.println("나이 : " + student1.getAge());
// student1은 appCTX_example01.xmlstudent1에서 직접 가져왔다. 결과값은 김나율, 28세이다.

        System.out.println("----------------------------------------------------");
        
        StudentInfo studentInfo = ctx.getBean("StudentInfo1", StudentInfo.class);
        Student student2 = studentInfo.getStudent();
        System.out.println("이름 : " + student2.getName());
        System.out.println("나이 : " + student2.getAge());
// ★ studentInfo는 student1으로 초기화된 StudentInfo1이라는 값을 getBean으로 가져오고 있고
// student2에 그 값을 넣어주고 있다. 결국 결과값은 yul, 100세이다.

// 동일한 결과 값과 equals메서드로 비교해도 같은 값이라고 나온다.
        
        System.out.println("----------------------------------------------------");
        
        Student student3 = ctx.getBean("student3", Student.class);
        System.out.println("이름 : " + student3.getName());
        System.out.println("나이 :" + student3.getAge());
// student3은 appCTX_example02.xmlstudent3에서 직접 가져왔다. 결과값은 rim, 120세이다.
        
        System.out.println("----------------------------------------------------");
        
        Family family = ctx.getBean("family1", Family.class);
        System.out.println(family.getPapaName());
        System.out.println(family.getMamaName());
// family는 appCTX_example02.xml의 family1에서 가져왔다.
// 원래 family예제는 namespaces활용을 위해 생성했는데 쓰지 않을 것 같아서 생략했다.
 
    }
 
}
cs

*

특히 참조하여 값을 가져오는 부분이 

이해될 듯 말듯 볼 때마다 아리송해서 

보고 또 봐야할 것 같다.