hyeonga_code

Spring_Spring DI_Dependency Injection_XML 설정_컨테이너, init-method, destroy-method, lazy-init 메소드 (보충하기) 본문

Spring

Spring_Spring DI_Dependency Injection_XML 설정_컨테이너, init-method, destroy-method, lazy-init 메소드 (보충하기)

hyeonga 2023. 12. 15. 06:59
반응형


- 스프링 컨테이너
    - BeanFactory
          - 빈 객체 간의 의존 관계를 설정하는 기능을 제공하는 단순한 컨테이너
          - Resource에서 정보를 읽어옴
          - XmlBeanFactory 객체를 생성
          - getBean() 메소드로 빈을 가져와 사용
     - applicationContext
          - 추가적인 기능을 제공
          - 빈 객체 라이프 사이클, 파일과 같은 자원의 추상화, 메세지 지원 및 국제화 지원, 이벤트 지원, XML 스키마 확장을 통한 편리한 설정
          - ClassPathXmlApplicationContext
          - FileSystemXmlApplicationContext
     - XmlApplicationContext
     - GenericXmlApplicationContext
          - 파일 시스템이나 클래스 경로에 있는 XML 설정 파일을 로딩합니다.
          - 로딩한 설정 파일을 구동하는 컨테이너입니다.
     - WebApplicationContext
          - 웹 어플리케이션마다 한 개 이상의 WebApplicationContext를 가질 수 있습니다.
          - web.xml 파일의 설정 정보로 XmlWebApplicationContext 객체 생성, 사용
     <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>WEB-INF/applicationContext.xml</param-value>
     </context-param>
     <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>
     - XmlWebApplicationContext 객체는 WebApplicationContextUtils 클래스를 이용하여 구합니다.
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
MyService myService = (MyService)context.getBean("myService");

>>> 그러나 잘 사용하지 않습니다.

- 스프링 XML 설정
     - <beans> 루트 엘리먼트
          - 설정파일의 이름은 상관없습니다.
          - 반드시 <beans>를 루트 엘리먼트로 사용합니다.
          - STS를 이용하여 만든 스프링 설정파일에는 beans 네임스페이스가 기본 네임스페이스로 선언되어 있습니다.
          - spring-beans.xsd 스키마 문서가 schemaLocation으로 등록되어 있습니다.
          - 따라서 <bean>, <description>, <alias>, <import> 등의 네 개의 자식 엘리먼트를 사용할 수 있습니다.
          - 실제로는 <bean>, <import> 정도가 사용됩니다.

          - <import>
               - 기능별로 여러 XML 파일로 나누어 설정합니다.
               - 나눈 XMl 파일을 통합할 때 사용합니다.
          - <bean>
               - 스프링 컨테이너가 관리할 빈 객체를 생성하기 위해 bean 태그 사용
               - 요소/속성
                    - id
                    - name
                     - class
                     - parent
                     - abstract
                     - singleton
                     - lazy-int
                     - autowire
                     - dependency-check
                     - depends-on
                     - init-method
                     - destroy-method
                     - factory-method


- 'SamsungTV2.java', 'LgTV2.java' 클래스를 3으로 복사하여 내용 추가

public SamsungTV3() {
    System.out.println("[  SamsungTV 객체 생성  ]");
}

public void start() {
     System.out.println("[  객체 초기화 작업 처리  ]");
}

public void stop() {
     System.out.println("[  객체 삭제 전 처리할 로직을 처리  ]");
}


-'init-method, destroy-method' 사용하기
'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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="tv" class="basic.spring.polymorphism.SamsungTV3" init-method="start" destroy-method="stop"/>
    <bean id="tv2" class="basic.spring.polymorphism.LgTV3"/>
</beans>




'TVUser4.java'
=====

package basic.spring.polymorphism;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class TVUser4 {
    public static void main(String[] args) {
        AbstractApplicationContext fac = new GenericXmlApplicationContext("applicationContext.xml");
        
        TV tv = (TV)fac.getBean("tv");
        tv.powerOn();
        tv.volumeUp();
        tv.volumeDown();
        tv.powerOff();
        System.out.println();
        
        TV tv2 = (TV)fac.getBean("tv2");
        tv2.powerOn();
        tv2.volumeUp();
        tv2.volumeDown();
        tv2.powerOff();
        
        fac.close();
        
        /*
            [  SamsungTV 객체 생성  ]
            [  객체 초기화 작업 처리  ]
            [  lgTV 객체 생성  ]
            SamsungTV 전원을 켠다.
            SamsungTV 볼륨을 올린다.
            SamsungTV 볼륨을 내린다.
            SamsungTV 전원을 끈다.
            
            LgTV 전원을 켠다.
            LgTV 볼륨을 올린다.
            LgTV 볼륨을 내린다.
            LgTV 전원을 끈다.
            [  객체 삭제 전 처리할 로직을 처리  ]
         */
    }
}




- 'lazy-init 메소드'
'applicationContext.xml'
tv2에 기능 추가 lazy-init="true"
=====

<?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="tv" class="basic.spring.polymorphism.SamsungTV3" init-method="start" destroy-method="stop"/>
    <bean id="tv2" class="basic.spring.polymorphism.LgTV3" lazy-init="true"/>
</beans>
 



'TVUser4.java'실행 결과
/*
    [  SamsungTV 객체 생성  ]
     [  객체 초기화 작업 처리  ]
     SamsungTV 전원을 켠다.
     SamsungTV 볼륨을 올린다.
     SamsungTV 볼륨을 내린다.
     SamsungTV 전원을 끈다.

     [  lgTV 객체 생성  ]
     LgTV 전원을 켠다.
     LgTV 볼륨을 올린다.
     LgTV 볼륨을 내린다.
     LgTV 전원을 끈다.
     [  객체 삭제 전 처리할 로직을 처리  ]
 */


      - scope : 빈 객체의 범위
            - 하나의 빈 설정에 대해 한 개의 빈 객체만을 생성
            - scope 속성 값
                  - singleton
                        - 스프링 컨테이너에 한 개의 빈 객체만 존재합니다.
                        - 기본값
                  - prototype
                        - 빈을 사용할 때마다 객체를 생성합니다.
                  - request
                        - HTTP 요청마다 빈 객체를 생성합니다.
                        - WebApplicationContext에서 적용
                  - session
                        - HTTP 세션마다 빈 객체를 생성합니다.
                        - WebApplicationContext에서 적용
                  - global-session
                        - 글로벌 HTTP 세션에 대해 빈 객체를 생성합니다.
                        - 포틀릿을 지원하는 컨텍스트에 대해서만 적용이 가능합니다.

- 'applicationContext.xml'
      <bean id="tv" class="basic.spring.polymorphism.SamsungTV5" scope="singleton"/>
=====

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
<!-- scope     -->
    <bean id="samsungTV3" class="sts.spring.ioc.SamsungTV3" scope="singleton" />
    <bean id="lgTV3" class="sts.spring.ioc.LgTV3" scope="prototype" />
    
</beans>



'SamsungTV3.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
package sts.spring.ioc;
 
public class SamsungTV3 implements TV {
    
    public SamsungTV3() {
        System.out.println("[     Create SamsungTV3     ]");
    }
    
    @Override
    public void powerOn() {
        System.out.println("SamsungTV3 powerOn");
    }
    
    @Override
    public void powerOff() {
        System.out.println("SamsungTV3 powerOff");
    }
    
    @Override
    public void volumeUp() {
        System.out.println("SamsungTV3 volumeUp");
    }
    
    @Override
    public void volumeDown() {
        System.out.println("SamsungTV3 volumeDown");
    }
}
 



'LgTV3.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
package sts.spring.ioc;
 
public class LgTV3 implements TV{
 
    public LgTV3() {
        System.out.println("[       Create LgTV3       ]");
    }
    
    @Override
    public void powerOn() {
        System.out.println("LgTV3 powerOn");
    }
 
    @Override
    public void powerOff() {
        System.out.println("LgTV3 powerOff");        
    }
 
    @Override
    public void volumeUp() {
        System.out.println("LgTV3 volumeUp");
    }
 
    @Override
    public void volumeDown() {
        System.out.println("LgTV3 volumeDown");        
    }
 
}
 



'TVUser3.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
package sts.spring.ioc;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class TVUser3 {
    public static void main(String[] args) {
        
        // Spring 컨테이너를 구동합니다.
        AbstractApplicationContext fac = new GenericXmlApplicationContext("applicationContext.xml");
        
        // Spring 컨테이너에 등록한 객체를 요청합니다.
        TV samsungTV1 = (TV) fac.getBean("samsungTV3");
        TV samsungTV2 = (TV) fac.getBean("samsungTV3");
        TV samsungTV3 = (TV) fac.getBean("samsungTV3");
        
        samsungTV1.powerOn();
        samsungTV2.powerOn();
        samsungTV3.powerOn();
        System.out.println();
        
        TV lgTV1 = (TV) fac.getBean("lgTV3");
        TV lgTV2 = (TV) fac.getBean("lgTV3");
        TV lgTV3 = (TV) fac.getBean("lgTV3");
        
        lgTV1.powerOff();
        lgTV2.powerOff();
        lgTV3.powerOff();
        
        
        // Spring 컨테이너를 종료합니다.
        fac.close();
            /*
             - singletone : 하나의 객체만 생성됩니다.
                [     Create SamsungTV3     ]
                SamsungTV3 powerOn
                SamsungTV3 powerOn
                SamsungTV3 powerOn
                
            - prototype : 여러 객체를 생성할 수 있습니다.
                [       Create LgTV3       ]
                [       Create LgTV3       ]
                [       Create LgTV3       ]
                LgTV3 powerOff
                LgTV3 powerOff
                LgTV3 powerOff
             */
    }
}
 































반응형