본문 바로가기

개발/Spring

#2 @Configuration과 @Bean의 의존 관계

src/main/java/chap02에 class를 생성한다.

 

*Greeter.java

package chap02;

public class Greeter {
	private String format;

	public String greet(String guest) {
		return String.format(format, guest);
	}

	public void setFormat(String format) {
		this.format = format;
	}

}

 

*AppContext.java

package chap02;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppContext {

	@Bean
	public Greeter greeter() {
		Greeter g = new Greeter();
		g.setFormat("%s, 안녕하세요!");
		return g;
	}

}

 

 

@Configuration 애노테이션은 해당 클래스를 스프링 설정 클래스로 지정한다.

@Bean 애노테이션을 메서드에 붙이면 해당 메서드가 생성한 객체를 스프링이 관리하는 빈 객체로 등록한다. 메서드의 이름은 빈 객체를 구분할 때 이용된다.  

 

*Main.java

package chap02;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(AppContext.class);
		Greeter g = ctx.getBean("greeter", Greeter.class);
		String msg = g.greet("스프링");
		System.out.println(msg);
		ctx.close();
	}
}

AnnotationConfigApplicationContext 클래스는 자바 설정에서 정보를 읽어와 빈 객체를 생성하고 관리한다. 이 클래스의 객체를 생성할 때 앞서 작성한 AppContext 클래스를 생성자 파라미터로 전달한다. 그럼 AppContext에 정의한 @Bean 설정 정보를 읽어와 Greeter객체를 생성하고 초기화한다.

 

.getBeam메서드는 Bean객체를 검색할 때 사용된다. 1번째 파라미터는 @Bean 애노테이션의 메서드 이름인 빈 객체의 이름이고, 두번째 파라미터는 검색할 빈 객체의 타입이다. 

 

이는 Greeter 객체의 format필드의 값은 "%s, 안녕하세요!" 가 된다. 따라서 g.greet("스프링")의 코드값은 "스프링, 안녕하세요!" 가 된다.

 

즉, AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);

는 설정 정보를 이용해서 빈 객체를 생성하고

Greeter g = ctx.gerBean("greeter", Greeter.class); 는 Bean객체를 제공한다.

 

ApplicationContext 또는 BeanFactory는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하므로 컨테이너라고 부른다.

스프링 컨테이너는 내부적으로 빈 객체와 빈 이름을 연결하는 정보를 갖는다. 

 

*Main2.java

package chap02;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main2{

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(AppContext.class);
		Greeter g1 = ctx.getBean("greeter", Greeter.class);
		Greeter g2 = ctx.getBean("greeter", Greeter.class);
		System.out.println("(g1 == g2) = " + (g1 == g2));
		ctx.close();
	}
}

g1과 g2는 이름이 greeter인 빈 객체를 구해서 할당한 것이다. g1과 g2가 같은 객체인지 확인하기 위해 콘솔로 출력하면 g1==g2의 결과는 true로 나온다. 즉 g1과 g2는 같은 객체이다.

 

별도 설정을 하지 않을 경우 스프링은 한 개의 빈 객체만을 생성하며, 이때 빈 객체는 '싱글톤 범위를 갖는다' 라고 표현한다. 싱글톤은 단일 객체를 의미하고 스프링은 기본적으로 한 개의 @Bean 애노테이션에 대해 한 개의 빈 객체를 생성한다. 

반응형

'개발 > Spring' 카테고리의 다른 글

개발에 유용한 라이브러리  (0) 2020.06.16
#3 스프링 DI(Dependency Injection)  (0) 2020.01.14
#1 Spring?  (0) 2020.01.14
redirect 시 파라미터값 넘기는 방법  (1) 2019.04.17
Spring에서 MyBatis 연동하기  (0) 2019.04.08