아무거나

[spring] DI 설정 방법 본문

Java & Kotlin/Spring

[spring] DI 설정 방법

전봉근 2019. 12. 25. 23:18
반응형

[spring] DI 설정 방법

 

(1) xml파일을 이용한 DI 설정 방법

    [Student.java]

public class Student {
    private String name;
    private int age;
    private ArrayList<String> hobbys;
    private double height;
    private double weight;

    // 필드 5개중에 3개(name, age, hobbys)를 초기화해주고 2개를 setter를 이용하고 있다.
    public Student(String name, int age, ArrayList<String> hobbys) {
    	this.name = name;
    	this.age = age;
    	this.hobbys = hobbys;
    }

    public void setName(String name) {
    	this.name = name;
    }

    public void setAge(int age) {
    	this.age = age;
    }

    public void setHobbys(ArrayList<String> hobbys) {
    	this.hobbys = hobbys;
    }

    public void setHeight(double height) {
    	this.height = height;
    }

    public void setWeight(double weight) {
    	this.weight = weight;
    }

    public String getName() {
    	return name;
    }

    public int getAge() {
    	return age;
    }

    public ArrayList<String> getHobbys() {
    	return hobbys;
    }

    public double getHeight() {
    	return height;
    }

    public double getWeight() {
    	return weight;
    }
}

 

    [StudentInfo.java]

public class StudentInfo {
    private Student student;

    public StudentInfo() {
    	// TODO Auto-generated constructor stub
    }

    public void setStudent(Student student) {
    	this.student = student;
    }

    public Student getStudent() {
    	return student;
    }
}

 

 

    [StudentInfo.java]

public class Family {
    String papaName;
    String mamiName;
    String sisterName;
    String brotherName;

    // 4개의 필드중에 2개만 생성자에서 초기화 해주고 있다. 나머지는 setter에서 처리한다.
    public Family(String papaName, String mamiName) {
    	this.papaName = papaName;
    	this.mamiName = mamiName;
    }

    public Family(String papaName, String mamiName) {
    	this.papaName = papaName;
    	this.mamiName = mamiName;
    }

    public String getPapaName() {
    	return papaName;
    }

    public void setPapaName(String papaName) {
    	this.papaName = papaName;
    }

    public String getMamiName() {
    	return mamiName;
    }

    public void setMamiName(String mamiName) {
    	this.mamiName = mamiName;
    }

    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;
    }
}

 

    [applicationCTX.xml]

            ....

            <bean id="student1" class="com.javalec.ex.Student">
            <constructor-arg value="홍길동" />
            <constructor-arg value="10" />
            <constructor-arg>
            <list>
                <value>수영</value>
                <value>요리</value>
            </list>
        </constructor-arg>

        <property name="height">
        <value>187</value>
    </property>

    <property name="weight" value="84" />
</bean>

<bean id="sutudentInfo1" class="com.javalec.ex.StudentInfo">
    <property name="student">
    	<ref bean="student1"/> <!-- 해당 소스 위에 있는 student1을 레퍼런스 하고 있다. -->
    </property>
</bean>

....

 

    [applicationCTX1.xml]

....

<bean id="student3" class="com.javalec.ex.Student">
    <constructor-arg value="홍길자" />
    <constructor-arg value="8" />
    <constructor-arg>
        <list>
            <value>줄넘기</value>
            <value>공기놀이</value>
        </list>
    </constructor-arg>
    <property name="height">
    	<value>126</value>
    </property>
    <property name="weight" value="21" />
</bean>

<bean id="family" class="com.javalec.ex.Family" c:papaName="홍아빠" c:mamiName="홈엄마" p:sisterName="홍누나">
	<property name="brotherName" value="홍오빠" />
</bean>

....

 

        * <bean id="family" class="com.javalec.ex.Family" c:papaName="홍아빠" c:mamiName="홈엄마" p:sisterName="홍누나"> 는

  namespace인 c와 p가 있다고 명시하는것이다.

  -> 우리가 어떤 객체를 빈객체를 생성할때 생성자에서 사용할꺼면 constructor-arg를 사용했고

     setter이용하여 설정하면 property를 사용했다.

     하지만 위에 2개의 방법도 싫고 간단하게 쓴다면 namespace를 사용한다 

     ex) c:papaName="홍길동"  //  c <- constructor-arg, papaName는 필드이름, ""안에 있는것은 기초데이터

 

    [MainClass.java]

public class MainClass {
    public static void main(String[] args) {
        String configLocation1 = "classpath:applicationCTX.xml";
        String configLocation2 = "classpath:applicationCTX1.xml";
        // 컨테이너 생성할때 스프링 설정 파일이 다수일경우 아래와 같이 쓸 수 있다.
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation1, configLocation2);

        Student student1 = ctx.getBean("student1", Student.class);
        System.out.println(student1.getName()); //홍길동
        System.out.println(student1.getHobbys()); // 수영, 요리
        StudentInfo studentInfo = ctx.getBean("sutudentInfo1", StudentInfo.class);
        Student student2 = studentInfo.getStudent(); //student1  == student2
        System.out.println(student2.getName()); //홍길동
        System.out.println(student2.getHobbys()); // 수영, 요리

        if(student1.equals(student2)) {
        	System.out.println("student1 == student2");
        }

        Student student3 = ctx.getBean("student3", Student.class);
        System.out.println(student3.getName());

        if(student1.equals(student3)) {
        	System.out.println("student1 == student3");
        } else {
        	System.out.println("student1 != student3");
        }

        Family family = ctx.getBean("family", Family.class);
        System.out.println(family.getPapaName());
        System.out.println(family.getMamiName());
        System.out.println(family.getSisterName());
        System.out.println(family.getBrotherName());
        ctx.close();
    }
}

 

 

(2) java를 이용한 DI 설정

@Configuration : 이 클래스는 스프링 설정에 사용되는 클래스이다. 라고 명시해 주는 어노테이션

@Bean : 객체 생성

 

    [Student.java]

public class Student {
    private String name;
    private int age;
    private ArrayList<String> hobbys;
    private double height;
    private double weight;

    public Student(String name, int age, ArrayList<String> hobbys) {
    	this.name = name;
    	this.age = age;
    	this.hobbys = hobbys;
    }

    public void setName(String name) {
    	this.name = name;
    }

    public void setAge(int age) {
    	this.age = age;
    }

    public void setHobbys(ArrayList<String> hobbys) {
    	this.hobbys = hobbys;
    }

    public void setHeight(double height) {
    	this.height = height;
    }

    public void setWeight(double weight) {
    	this.weight = weight;
    }

    public String getName() {
    	return name;
    }

    public int getAge() {
    	return age;
    }

    public ArrayList<String> getHobbys() {
    	return hobbys;
    }

    public double getHeight() {
    	return height;
    }

    public double getWeight() {
    	return weight;
    }
}

 

    [ApplicationConfig.java]

@Configuration   // 스프링 설정 파일로 쓰일 녀석이라고 알리는 어노테이션 설정
public class ApplicationConfig {
    @Bean // bean 생성
    public Student student1() {  // Student.java(Student타입)의 studnet1을 생성한다.
        ArrayList<String> hobbys = new ArrayList<String>();
        hobbys.add("수영");
        hobbys.add("요리");

        Student student = new Student("홍길동", 20, hobbys);
        student.setHeight(180);
        student.setWeight(80);
        return student;
    }

    @Bean
    public Student student2() {
        ArrayList<String> hobbys = new ArrayList<String>();
        hobbys.add("독서");
        hobbys.add("음악감상");

        Student student = new Student("홍길순", 18, hobbys);
        student.setHeight(170);
        student.setWeight(55);

        return student;
    }
}

 

    [MainClass.java]

public class MainClass {
    public static void main(String[] args) {
        // 자바파일을 이용하면 AnnotationConfigApplicationContext을 사용한다.
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);

        Student student1 = ctx.getBean("student1", Student.class);
        System.out.println("이름 : " + student1.getName());
        System.out.println("나이 : " + student1.getAge());
        System.out.println("취미 : " + student1.getHobbys());
        System.out.println("신장 : " + student1.getHeight());
        System.out.println("몸무게 : " + student1.getWeight());

        Student student2 = ctx.getBean("student2", Student.class);
        System.out.println("이름 : " + student2.getName());
        System.out.println("나이 : " + student2.getAge());
        System.out.println("취미 : " + student2.getHobbys());
        System.out.println("신장 : " + student2.getHeight());
        System.out.println("몸무게 : " + student2.getWeight());
        ctx.close();
    }
}

 

*** java파일 안으로 xml파일을 갖고 들어올때

@Configuration

@ImportResource("classpath:applicationCTX.xml") // 리소스를 import를 한다.

public class ApplicationConfig {

....

}

 

---> 즉, XML파일에 JAVA파일을 포함시켜 사용한다거나 JAVA파일에 XML파일을 포함시켜 사용할 수 있다.

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/dashboard

반응형
Comments