관리 메뉴

nalaolla

Spring Framework: beans - 의존관계 설정 본문

SPRING

Spring Framework: beans - 의존관계 설정

날아올라↗↗ 2016. 5. 31. 09:49
728x90
반응형

Spring Framework: beans - 의존관계 설정


생성자를 이용한 의존관계 설정방법


클래스 작성

package com.sp1;
 
public interface User{
    public String result();
}
cs
package com.sp1;
 
public class UserImpl implements User {
    private String name;
    private int age;
    
    public UserImpl() {
        name = "김혜진";
        age = 35;
    }
    
    public UserImpl(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String result() {
        return name + "님의 나이는" + age + "세후니?";
    }
}
cs
package com.sp1;
 
public class TestService {
    public User user;
    
    public TestService(User user) {
        this.user = user;
    }
    
    public String getData() {
        if(user != null)
            return user.result(); 
    
        return null;
    }
}
cs


xml 설정

<!--com/sp1/applicationContext.xml-->
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">          
 
    <!-- 객체생성(인자가없는생성자호출) -->        
    <bean id="user1" class="com.sp1.UserImpl"/>
    
    <!-- 객체생성(인자가있는생성자호출) -->        
    <bean id="user2" class="com.sp1.UserImpl">
         <constructor-arg value="이형근"/
         <constructor-arg value="40"/>
    </bean>
    
    <!-- 객체생성 및 생성자를 통한 의존관계 설정 -->
    <bean id="testService1" class="com.sp1.TestService">
        <constructor-arg ref="user1"/<!-- ref : 참조형 변수를 뜻함 -->
    </bean>
</beans>
cs


실행

package com.sp1;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class ResultMain {
    public static void main(String[] args) {
        /* - BeanFactory : 스프링 컨테이너 생성
         * - ApplicationContext : BeanFactory 를 상속받은 인터페이스로
         *    빈객체의 라이플사이클 관리, 국제화, 이벤트처리 등의 기능등이 확장
         * -ClassPathXmlApplicationContext : 클래스 패스에 위치한 xml 파일로부터 설정파일을 로딩
         */
        
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("com/sp1/applicationContext.xml");        
        
        //스프링 컨테이너에서 빈 객체를 가져옴
        TestService service = (TestService)context.getBean("testService1");
        
        System.out.println(service.getData());
    }
}
cs

result → 김혜진님의 나이는35세후니?


프로퍼티를 이용한 의존관계 설정방법


클래스 작성

public interface User {
    public String result();
}
cs
package com.sp2;
 
public class UserImpl implements User {    
    private String name, tel;
    private int age;
 
    public String getName() { 
        return name; 
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getTel() {
        return tel;
    }
    
    public void setTel(String tel) {
        this.tel = tel;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;   
    }
        
    public String getMessage() {
        return name + " : " + tel + " : " + age;
    }
}
cs
public class UserService {
    private User user;
    
    public void setUser(User user)    {
        this.user = user;
    }
    
    public void print() {
        System.out.println(user.getMessage());
    }
}
cs


xml 설정

<!-- com/sp2/applicationContext.xml -->
<!-- 객체생성(인자가 없는 생성자) 및 프로퍼티 설정 -->
<!-- 프로퍼티를 설정하기 위해서는 setter가 존재해야함 -->
<bean id="user1" class="com.sp2.UserImpl"<!-- 객체생성 → user1 : 식별자 -->
    <property name="name" value="스프링"/<!-- 프로퍼티 설정방법-1 -->
    <property name="tel">
        <value type="java.lang.String">010-000-0000</value
<!-- 프로퍼티 설정방법-2 -->
    </property>
    <property name="age" value="20"/>
</bean>
 
<!-- 객체 생성 및 프로퍼티를 이용한 의존관계 설정(setter필요) -->
<bean id="userService" class="com.sp2.UserService">
<!--         <property name="user" ref="user1"/> --> 
    <property name="user">
        <ref bean="user1"/>
    </property>    
    <!-- 위에서 만든 객체 user1를 userService의 매개변수로 할당  -->
</bean>
cs


실행

package com.sp2;
 
public class ResultMain {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("com/sp2/applicationContext.xml");        
        
        //스프링 컨테이너에서 bean객체를 가져옴
        //UserService service = (UserService)context.getBean("userService1");
        UserService service = context.getBean(UserService.class);
        service.print();
    }
}
cs

결과: '스프링: 010-000-0000 : 20'

순수 자바 코드로 바꾸면 아래와 같다.

UserImpl ui = new UserImpl();
UserService us = new UserService();
 
ui.setAge(20);
ui.setName("스프링");
ui.setTel("010-000-0000");
 
User user = ui;
 
us.setUser(user);
 
us.print();
cs


p 네임스페이스를 이용한 의존관계 설정


클래스 작성

다른것과 같다. 생략


xml 설정

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    <!-- com/sp2/applicationContext.xml -->
    <!-- p 네임스페이스를 이용한 프로퍼티 설정 -->
    <bean id="user2" class="com.sp2.UserImpl" p:name="자바" p:tel="010-1111-1111" p:age="30"/>
     
    <!-- p 네임스페이스를 이용한 의존관계설정 -->
    <bean id="userService2" class="com.sp2.UserService" p:user-ref="user2"/>
</beans>
cs


컬렉션/맵


클래스 작성

package com.sp3;
 
public class UserImpl implements User {
    private String name;
    private Map<StringString> address;
    private List<String> hobby;
 
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAddress(Map<StringString> address) {
        this.address = address;
    }
    
    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }
 
    public String getData() {
        String str = "이름" + name;
        str+="\n======================";
        str+="\n친구주소록............";
        
        Iterator<String> it = address.keySet().iterator();
        while(it.hasNext()) {
            String n = it.next();
            String a = address.get(n);
            
            str += "\n" + n + "   " + a;
        }
        
        str += "\n취미.................";
        for(String s : hobby) {
            str += "\n" + s;
        }
        return str;
    }
}
cs


xml 설정

<!-- 컬렉션 타입 프로퍼티 설정 -->
<bean id="user" class="com.sp3.UserImpl">
    <property name="name" value="우앙굳"/>
    <property name="address">
        <map>
            <entry>
                <key><value>이상해</value></key>
                <value>서울</value>
            </entry><!-- 맵에 값 할당방법-1 -->
            
            <entry key="이이이" value="부산"/>
            <!-- 맵에 값 할당방법-2 -->
<!--                 <entry key-ref="객체" value-ref="객체2"/> -->
        </map>
    </property>
    <property name="hobby">
        <list>
            <value>소개팅</value>
            <value>운동</value>
            <value>잠자기</value>
        </list>
    </property>
</bean>
 
<!--     <bean id="sss" class="com.sp3.UserService"> -->
<!--         <property name="user" p:user-ref="uuu"/> -->
<!--     </bean> -->
<bean id="sss" class="com.sp3.UserService" p:user-ref="user"/>
cs


<bean id="sss" class="com.sp3.UserService" p:user-ref="user"/> 이 부분을 autowire 속성을 이용해 자동으로 찾도록 설정할 수 있다:

<!-- 의존관계 자동설정 -->
<!-- 프로퍼티와 동일한 id를 갖는 빈객체로 의존관계 설정(setter 필요) -->
<bean id="sss" class="com.sp3.UserService" autowire="byName"/>
 
<!-- 프로퍼티와 동일한 타입의 의존관계를 자동설정 -->
<bean id="sss" class="com.sp3.UserService" autowire="byType"/>
cs

단, 이 방법은 같은 이름의 클래스가 둘 이상일 경우 에러가 발생할 가능성이 매우 높다.


실행

package com.sp3;
 
public class ResultMain {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("com/sp3/applicationContext.xml");        
        
        //스프링 컨테이너에서 bean객체를 가져옴
        UserService service = (UserService)context.getBean("sss");
        System.out.println(service.result());
    }
}
cs


728x90
반응형

'SPRING' 카테고리의 다른 글

Spring Framework: MVC 작성방법 (non-annotation)  (0) 2016.05.31
Spring Framework: beans - xml 태그 정리  (0) 2016.05.31
Spring Framework: 포워딩/리다이렉션  (0) 2016.05.31
@RequestParam  (0) 2016.05.31
@ModelAttribute  (0) 2016.05.31