ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] XML을 이용한 DI(Dependency Injection) 설정
    프로그래밍/Spring 2015. 9. 23. 23:57
    반응형

    DI는 Dependency Injection의 약자로서 우리말로는 의존주입 이라는 단어로 번역되어 사용


    <bean> 태그를 이용해서 컨테이너가 생성할 빈 객체를 지정해주고 <property>태그나 <constructor-arg>태그를 이용해서 객체가 필요로 하는 값을 설정해주면 된다.


    <beans>태그는 XML 설정의 루트 태그이며 루트 태그에는 기본 네임스페이스와 XML스키마를 지정한다.


    스프링 jar파일은 지정한 XML 스키마 경로에 해당하는 스키마 설정 파일을 포함하고 있으므로 인터넷에 연결되어 있지 않더라도 XML 스키마 설정 파일을 정상적으로 읽어올수 수 있다.


    <bean> 태그 : 생성할 객체 지정

    <bean> 태그는 스프링 컨테이너가 생성할 객체에 대한 정보를 지정할 때 사용된다. 주요속성은 id와 class이다.


    class속성은 스프링 컨테이너가 생성할 객체의 클래스 이름을 값으로 갖는다. (이 때 클래스의 이름은 패키지 이름을 포함한 완전한 클래스의 이름이여야한다.)


    id 속성의 값은 <bean>태그를 이용해서 생성하는 스프링 빈 객체의 고유한 이름으로 사용한다.


    id속성으로 지정한 빈의 이름은 다른 <bean> 태그에서 참조할때 사용된다.




    스프링 빈의 이름은 스프링 컨테이너에서 직접 빈 객체를 구할 때에도 사용된다.


    * <constructor-arg> 태그 : 생성자 방식 설정

    [User.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
    package net;
     
    public class User {
        private String id;
        private String password;
     
        public User(String id, String password) {
            this.id = id;
            this.password = password;
        }
     
        public String getId() {
            return id;
        }
     
        public boolean matchPassword(String inputPasswd) {
            return password.equals(inputPasswd);
        }
     
        public void changePassword(String oldPassword, String newPassword) {
            if (!matchPassword(oldPassword))
                throw new IllegalArgumentException("illegal password");
            password = newPassword;
        }
     
    }
    cs


    User 클래스는 생성자를 이용해서 필요한 값을 전달받고 있다. User 객체를 스프링 빈으로 설정하려면 생성자에 전달할 값을 설정해주어야 하는데 이 때 사용되는 태그가 <constructor-arg >태그다.


    1
    2
    3
    4
    5
    <bean id="user2" class="net.UserRepository">
    <constructor-arg><value>samgak</value></constructor-arg>
    <constructor-arg value="qwer" />
    </bean>
     
    cs


    다른 빈 객체를 사용해야하는 경우에는 다음 코드와 같이 <value> 태그 또는 value 속성 대신에 <ref> 태그와 ref 속성을 사용한다.


    1
    2
    3
    4
    5
    6
    7
    <bean id="userRepository" class="net.UserRepository">
    </bean>
     
    <bean id="pwChangeSvc" class="net.PasswordChangeService">
    <constructor-arg ref="userRepository" />
    </bean>
     
    cs


    ref 속성의 값으로는 다른 빈 객체의 이름을 사용한다. <ref>태그를 사용할 때에는 다음 코드와 작성하면 된다.

    1
    2
    3
    4
    5
    6
    7
    <bean id="userRepository" class="net.UserRepository">
    </bean>
     
    <bean id="pwChangeSvc" class="net.PasswordChangeService">
    <constructor-arg><ref bean="userRepository"/></constructor-arg>
    </bean>
     
    cs


    별도 설정을 하지 않으면 <constructor-arg> 태그의 순서가 생성자에 전달되는 파라미터의 순서가 된다. 파라미터를 명시적으로 지정하려면 index 속성이나 name 속성을 사용할 수 있다.


    * <property> 태그 : 프로퍼티 방식 설정

    프로퍼티 설정 방식을 사용하는 경우에는 <property>태그를 사용한다. name 속성을 이용해서 프로퍼티 이름을 지정한다.

    프로퍼티의 값은 <value> 태그 또는 value 속성, <ref>태그 또는 ref속성을 이용해서 값을 지정할수 있다.




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
     
    <bean id="authFailLogger" class="net.AuthFailLogger">
        <property name="threshold" value="5" />
    </bean>
     
    <bean id="authService" class="net.AuthenticationService">
        <property name="failLogger" ref="authFailLogger" />
        <ref bean="userRepository" />
    </property>
    </bean>
    cs


    <property>태그를 사용하면 set프로퍼티이름() 형식의 메서드를 이용해서 값을 설정한다.


    * GenericXmlApplicationContext로 예제 실행하기

    설정 파일을 이용해서 스프링 컨테이너를 생성한다. 이떄 GenericXmlApplicationContext 클래스를 사용한다.

    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
    <?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="user1" class="net.User">
            <constructor-arg value="bkchoi" />
            <constructor-arg value="1234" />
        </bean>
     
        <bean id="user2" class="net.User">
            <constructor-arg value="madvirus" />
            <constructor-arg value="qwer" />
        </bean>
     
        <bean id="userRepository" class="net.UserRepository">
            <property name="users">
                <list>
                    <ref bean="user1" />
                    <ref bean="user2" />
                </list>
            </property>
        </bean>
     
        <bean id="pwChangeSvc" class="net.PasswordChangeService">
            <constructor-arg>
                <ref bean="userRepository" />
            </constructor-arg>
        </bean>
     
        <bean id="authFailLogger" class="net.AuthFailLogger">
            <property name="threshold" value="2" />
        </bean>
     
        <bean id="authenticationService" class="net.AuthenticationService">
            <property name="failLogger" ref="authFailLogger" />
            <property name="userRepository" ref="userRepository" />
        </bean>
    </beans>
     
     
    cs


    반응형

    댓글

Designed by Tistory.