2018년 4월 3일 화요일

Spring Bean 및 xml 사용법

1. Bean 개념 및 xml 사용법

Bean 이란 인스턴스생성, 관리 , 컨테이너에 의해 관리되는 객체이다.
(개발자가 직접 생성하는 객체는 Bean이 아니다)

1.1 new 객체 생성

new 객체를 사용하는 방식은 스프링 컨테이너에서 관리를 하지 않는다.
MyBean bean1 = new MyBean()

1.2 xml에 설정에서 bean을 가지고 오는 방법

<?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:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bean1" class="soundsystem.MyBean"/>
    <bean id="bean2" class="soundsystem.MyBean"/>
</beans>

public class SpringExam01 {
    public static void main(String[] args) throws Exception{
 ApplicationContext context
                 = new ClassPathXmlApplicationContext("exam01.xml");
 
 //MyBean bean1 = new MyBean(); //스프링이 관리해 주는것이 아니다. 이렇게 사용하면 안된다.
 
 // Spring은 기본적으로 객체를 싱글턴으로 관리한다.
 MyBean bean1 = (MyBean)context.getBean("bean1"); //Object타입으로 반환된다.
 MyBean bean2 = context.getBean(MyBean.class);
    }
}

1.3 xml 에 scope 설정

<?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:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bean1" class="soundsystem.MyBean"/> //기본 scope가 singleton 이다.
    <bean id="bean2" class="soundsystem.MyBean"scope="prototype"/> //매번 요청시 새로운 객체 생성
</beans>

1.4 xml 설정에서 scope 설정에 따른 load 순서

소스를 실행해보면 ApplicationContext 에서 설정한 class들이 먼저 메모리에 올라가면서 생성자가 먼저 호출되고 나서 소스가 실행된다. bean1과 bean2과 참조가 같은 이유는 scope는 기본적으로 singleton 이기 때문에 컨테이너에 같은 class에 대한 Bean은 하나만 올라가 있기 때문이다.


하지만 scope 설정이 prototype 이면 해당 class 호출될때 메모리에 올라간며 호출시마다 새로운 객체를 생성한다.
아래의 소스 xml 에서 <bean id="bean1" class="soundsystem.MyBean" scope="prototype"> 로 변경하여 실행해보자.


package soundsystem;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringExam02 {
    public static void main(String[] args) throws Exception{
        ApplicationContext context
                = new ClassPathXmlApplicationContext("exam02.xml");
        System.out.println("ApplicationContext 생성 이후.");
        MyBean bean1 = context.getBean("bean1", MyBean.class);
        System.out.println(bean1.getName());
        System.out.println(bean1.getCount());
        MyBean bean2 = context.getBean("bean1", MyBean.class);
        if(bean1 == bean2){ //같은 참조??
            System.out.println("bean1 == bean2");
        }else{ //scope="prototype" 이면 서로 다른 객체 생성
            System.out.println("bean1 != bean2");
        }

        MyBean bean3 = context.getBean("bean2", MyBean.class);
        System.out.println(bean3.getName() + ", "+ bean3.getCount());

        MyBean bean4 = context.getBean("bean3", MyBean.class);
        System.out.println(bean4.getValue("a1"));



    }
}

package soundsystem;

import java.util.Map;

public class MyBean {
    private String name;
    private int count;
    private Map map;

    public MyBean(){
        System.out.println("MyBean 생성자 호출");
    }

    public MyBean(String name, int count){
        this.name = name;
        this.count = count;
    }

    public MyBean(Map map){
        this.map = map;
    }

    public String getValue(String key){
        return map.get(key);
    }

    public String getName() {
        return name;
    }

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

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}


<?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:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
        MyBean bean1 = new MyBean();
        bean1.setName("ursotry");
        bean1.setCount(100);

        기본 scope는 싱글톤인데 설정파일을 읽으면 바로 메모리에 올라갈다. 하나의 객체로 실행
        scope="prototype 가 있으면 필요 할떄 마다 생성된다.(매번 새로운 객체)
    -->
    <bean id="bean1" class="soundsystem.MyBean" >
        <property name="name" value="urstory" />
        <property name="count" value="100" />
    </bean>

    <!-- 파라미터를 2개 받는 생성자를 이용하여 필드를 초기화 한다.-->
    <bean id="bean2" class="soundsystem.MyBean">
        <constructor-arg value="urstory" />
        <constructor-arg value="100" />
    </bean>

    <bean id="bean3" class="soundsystem.MyBean">
        <constructor-arg>
            <map>
                <entry key="a1" value="kang"></entry>
                <entry key="a2" value="Kim"></entry>
                <entry key="b1" value="Choi"></entry>
                <entry key="c1" value="Shin"></entry>
            </map>
        </constructor-arg>
    </bean>

</beans>

1.5 xml 설정

  • bean설정에서 위치는 상관이없다. 스프링이 자동적으로 필요한 인스턴스를 만들어 준다
  • xmlns:c="http://www.springframework.org/schema/c" 는 생성자를 뜻한다.
  • -ref : 참조하는 래퍼런스(객체)를 참조한다. / _0 : 1번째 생성자
<!-- bean설정에서 위치는 상관이없다. 스프링이 자동적으로 필요한 인스턴스를 만들어 준다. -->
  <!--
    BlankDisc compactDisc = new(BlankDisc("Sgt. Pepper's Lonely Hearts Club Band", "The Beatles");
    c:_0 : 1번재 생성자  , c:_1 : 2번째 생성자
  -->
  <bean id="compactDisc" class="soundsystem.BlankDisc"
        c:_0="Sgt. Pepper's Lonely Hearts Club Band"
        c:_1="The Beatles" />
  <!--
    CDPlayer cdPlayer = new CDPlayer();
    c:
  -->
  <bean id="cdPlayer" class="soundsystem.CDPlayer"
        c:_-ref="compactDisc" /> 
  • <constructor-arg> 태그는 생성자에 값을 넣는다.(자동으로 선언한 순서대로 파라미터에 순서에 맞게 값을 넣어준다)
  • <constructor-arg> 안에 <list> 태그는 자동으로 array를 만들어준다.
    <constructor-arg>
      <list>
        <value>Sgt. Pepper's Lonely Hearts Club Band</value>
        <value>With a Little Help from My Friends</value>
      </list>
    </constructor-arg>
  • p:파라미터명 은 property name="파라미터명" 을 사용한것과 같다.
  • setTitle , setArtist 메소드에 값이 적용된다.

    p:title="Sgt. Pepper's Lonely Hearts Club Band"
    p:artist="The Beatles"> 

    <property name="title" value="Sgt. Pepper's Lonely Hearts Club Band" />
    <property name="artist" value="The Beatles" />   
  • Util을 통해 간편하게 사용 가능하다.
  • schemaLocation은 에디터가 자동완성기능등 인식을 잘하게 하기 위함이다.
  • xsi:schemaLocation 의 뜻은 'http://www.springframework.org/schema/beans' 는 'http://www.springframework.org/schema/beans/spring-beans.xsd' 에 매핑되고 'http://www.springframework.org/schema/util' 는 ' http://www.springframework.org/schema/util/spring-util.xsd' 에 매핑된다는 뜻이다.
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util.xsd">

 <!--
    List<String> trackList = new ArrayList<>();
    tracklist.add("Sgt. Pepper's Lonely Hearts Club Band");
 -->
  <util:list id="trackList">  
    <value>Sgt. Pepper's Lonely Hearts Club Band</value>
    <value>With a Little Help from My Friends</value>
    <value>Lucy in the Sky with Diamonds</value>
    <value>Getting Better</value>
    <value>Fixing a Hole</value>
    <value>She's Leaving Home</value>
    <value>Being for the Benefit of Mr. Kite!</value>
    <value>Within You Without You</value>
    <value>When I'm Sixty-Four</value>
    <value>Lovely Rita</value>
    <value>Good Morning Good Morning</value>
    <value>Sgt. Pepper's Lonely Hearts Club Band (Reprise)</value>
    <value>A Day in the Life</value>
  </util:list> 

2.  실습

2.1 Main Source

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringExam01 {
    public static void main(String[] args) throws Exception{
        ApplicationContext context
                = new ClassPathXmlApplicationContext("exam01.xml");

        //MyBean bean1 = new MyBean(); //스프링이 관리해 주는것이 아니다. 이렇게 사용하면 안된다.

        // Spring은 기본적으로 객체를 싱글턴으로 관리한다.
        MyBean bean1 = (MyBean)context.getBean("bean1"); //Object타입으로 반환된다.
        bean1.setName("홍길동");

        MyBean bean2 = (MyBean)context.getBean("bean1");
        System.out.println(bean2.getName()); //홍길동이 출력된다.

        MyBean bean5 = context.getBean(MyBean.class);
        System.out.println(bean5.getName()); // MyBean클래스 타입의 빈을 요청한다. 1개일 경우에만 오류가 발생하지 않는다.

        MyBean bean3 = (MyBean)context.getBean("bean2");
        System.out.println(bean3.getName()); //홍길동이 출력된다.

        //bean3 이 라는 id의 빈은 설정되어 있지 않기 떄문에 Exception이 발생한다.
        /*MyBean bean4 = (MyBean)context.getBean("bean3");
        System.out.println(bean4.getName());*/


    }
}

2.2 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:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bean1" class="soundsystem.MyBean"/>
    <bean id="bean2" class="soundsystem.MyBean"/>
</beans>

2.3  CLASS

package soundsystem;

public class MyBean {
    private String name;
    private int count;

    public MyBean(){
        System.out.println("MyBean 생성자 호출");
    }

    public String getName() {
        return name;
    }

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

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
Share:

0 개의 댓글:

댓글 쓰기