스프링 DI 어노테이션, Context Configuration Annotations(@Scope) 이론 및 실습코드, 자바설…

 

스프링 DI 어노테이션, Context Configuration Annotations(@Scope) 이론 및 실습코드, 자바설정, @Scope, @Bean, @Component 실습 예제 

 

 

 

작성자 : 이종철

 

n  @Scope : 일반적으로 @Component, @Service, @Repository 어노테이션이 붙어있어 스프링 IoC 컨테이너가 자동 스캐닝한 자바빈은 싱글톤 형태로 하나만 생성하는데 이를 변경하려면 @Scope 어노테이션을 사용하면 된다.

 

n  스프링에서 자바빈의 Scope : 스프링 프레임워크의 IoC 컨테이너는 개발자를 대신해서 빈을 생성, 생명주기를 관리해 주고, 스프링 애플리케이션에서 빈이 필요한 시점에 스프링이 빈을 주입(DI, 의존성 주입)해 준다는 것이다. 이 때 기본적으로 모든 빈을 싱글톤으로 컨테이너에 하나만 생성하여 관리한다. 그래서 스프링 컨테이너에게 빈을 제공받으면 언제나 주입 받은 빈은 동일한 객체이다.

 

singleton – 스프링 IoC 컨테이너당 하나의 빈을 리턴

prototype – 스프링 IoC 컨테이너가 요청이 있을 때 마다 새로운 빈을 만들어 리턴

request - 하나의 Bean 정의에 대해서 하나의 HTTP request의 생명주기 안에 단 하나의 객체만 존재한다.

session - 하나의 Bean 정의에 대해서 하나의 HTTP session의 생명주기 안에 단 하나의 객체만 존재한다.

globalSession - 전체 모든 세션에 대해 하나의 빈을 리턴

 

@Component

@Scope("prototype")  //요구시마다 새로운 빈을 생성 후 리턴

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

class Ojc {

……

}

è

<bean id="ojc" class="oraclejava.edu.Ojc"   scope="prototype"/>

 

n  Java Configuration, @Scope, @Bean, @Component 실습 예제

n  1. EmpService.java

package test.scope;

 

class Emp {

    String ename;

   

    Emp(String ename) { this.ename = ename; }

 

    public String getEname() {

          return ename;

    }

 

    public void setEname(String ename) {

          this.ename = ename;

    }

}

 

public class EmpService {

    public Emp getEmp() {

          return new Emp("SMITH");

    }

}

 

n  2. DeptService.java

package test.scope;

 

import org.springframework.beans.factory.config.ConfigurableBeanFactory;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Component;

 

class Dept {

    String dname;

   

    Dept(String dname) {  this.dname = dname;  }

 

    public String getDname() {

          return dname;

    }

 

    public void setDname(String dname) {

          this.dname = dname;

    }

}

 

//Config.java 파일에 basePackage 경로를 주면

//스프링이 자동 스캐닝해서 빈을 검색후 dService 라는 이름으로 등록

@Component("dService")  

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public class DeptService {

    public Dept getDept() {

          return new Dept("영업부");

    }

}

 

n  3. Config.java

package test.scope;

 

import org.springframework.beans.factory.config.ConfigurableBeanFactory;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Scope;

 

 

//EmpService 자바설정 파일(Config.java) @Bean으로 정의하여 빈을 등록하고

//DeptService 자바설정 파일(Config.java) @ComponentScan 어노테이션으로 자동 스캐닝 하도록 정의, 이때 DeptService 클래스에는 @Component 등이 붙어야 한다.

 

//자바설정파일임을 알림

@Configuration 

//@Component, @Service, @Repository, @Controller등의 어노테이션이

//붙어 있는 클래스() 자동으로 탐색할 패키지 경로를 지정

@ComponentScan(basePackages="test.scope")

public class Config {

    @Bean(name = "empService")  //빈의 이름을 empService 지정

    @Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)

    public EmpService getEmpService() {

          return new EmpService();

    }    

}

 

n  4. MainApp.java

package test.scope;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 

public class MainApp {

    public static void main(String[] args) {

          ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

         

          EmpService empService1 = context.getBean(EmpService.class);

          DeptService deptService = (DeptService) context.getBean("dService");

          System.out.println(empService1.getEmp().getEname());

          System.out.println(deptService.getDept().getDname());

         

          EmpService empService2 = context.getBean(EmpService.class);

          System.out.println(empService2.getEmp().getEname());

         

          //빈의 Scope ProtoType이므로 요청마다 객체를 새로 생성한다. 주소 비교

          if(empService1 == empService2) System.out.println(" EmpService 객체는 같다.");

          else System.out.println(" EmpService 객체는 다르다.");

    }

}

 

//결과

SMITH

영업부

SMITH

EmpService 객체는 다르다.

 

 

 

 

Comments