Spring - Annotation을 통한 Bean 설정

2020. 8. 24. 22:30Java/Spring

반응형

Spring 2.5 버전 부터 xml 통한 빈 설정 방법 외에 어노테이션을 이용한 빈 설정 방법을 제공하고 있다.

 

 

빈 설정 파일에 다음과 같은 코드를 추가하면 빈에 대한 설정을 xml 파일이 아닌 빈 클래스의 어노테이션을 검색해 반영하게 된다.

 

<context:annotation-config/>

 새로운 패키지를 생성하고, beans.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: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.xsd">
						
	<context:annotation-config/>
    
    </beans>

context를 사용하기 위해 이전과 달리 몇 줄의 태그가 추가되었다.


1. @Autowired   - 자동주입

@Autowired 어노테이션은 자동으로 자료형을 찾아서 주입되게 된다.

 

TestBean1 클래스에 다음과 같이 data2의 setter에 어노테이션을 설정해주자.

//자동주입(타입)
@Autowired
public void setData2(DataBean1 data2) {
	this.data2 = data2;
}

이럴경우 설정된 빈 파일로 가서 같은 자료형인 DataBean1을 찾아서 값을 가져와 자동으로 주입이 된다.

 

즉, beans.xml의 파일에 다음과 같이 

<bean class="cookingcoding.beans.DataBean1" />

DataBean1의 빈 객체가 있으면 해당 객체가 자동 주입이 되고, BeanConfigClass의 파일에서 다음과 같이 빈을 정의했다면 DataBean1 자료형을 가진 java2가 자동으로 주입이 된다.

@Bean
public DataBean1 java2() {
	return new DataBean1();
}

또, @Autowired는 setter 메서드를 생성하지 않아도 자동으로 생성하여 주입을 해준다.

//자동주입을 설정하면 setter를 따로 안만들어도 자동으로 된다.
@Autowired
private DataBean1 data3;

위 코드는 setter를 만들지 않아도 자동으로 DataBean1을 자료형으로 하는 빈 객체를 찾아 주입한다.

 


2. @Qualifier

같은 타입을 찾아서 주입이 되는것은 같은 타입을 가진 빈 객체가 2개이상이면 어떤 객체에 주입되야 하는지 찾을 수 없다. 이때, @Qualifier을 이용해서 이름을 통해 주입이 가능하다.

 

TestBean1 클래스에 다음과 같이 만든다.

@Autowired
@Qualifier("java3")
private DataBean2 data4;

위 코드는 DataBean2를 자료형으로 하는 빈 객체를 찾지만 이름이 java3인 메서드를 찾게 된다.

 

즉 BeanConfigClass에 다음과 같이 정의가 되어있다면

@Bean
public DataBean2 java3() {
	return new DataBean2();
}
	
@Bean
public DataBean2 java4() {
	return new DataBean2();
}

 

DataBean2 자료형을 갖는 빈 객체가 2개여서 @Autowired를 통해서는 자동 주입할 객체를 찾을 수 없다. 하지만 @Qualifier를 줌으로써 java3()메서드를 찾아 자동으로 주입한다.

 


3. @Value - 생성자를 통한 주입

 

TestBean2 클래스에 다음과 같이 있다.

public class TestBean2 {
	private int data1;
	private String data2;
	private DataBean3 data3;
	private DataBean4 data4;
    
    
    	public int getData1() {
		return data1;
	}

	public String getData2() {
		return data2;
	}

	public DataBean3 getData3() {
		return data3;
	}

	public DataBean4 getData4() {
		return data4;
	}
	
	
}

해당 클래스에서 생성자를 만들어서 값을 바로 주입 가능하다.

 

생성자를 아래와 같이 만들자.

public TestBean2(@Value("100") int data1,@Value("문자열") String data2,DataBean3 data3,DataBean4 data4) {
				// bean.xml에  <context:annotation-config/> 있을시 생성자에서 @Value로 값 주입 가능
	this.data1 = data1;
	this.data2 = data2;
	this.data3 = data3;
	this.data4 = data4;
}

위 코드에서 @Value(값)을 통해서 일반 자료형의 변수에 값을 담고, 객체 자료형은 타입을 통해 주입이 된다.

 

주입을 위한 beans.xml

<bean id="xml2" class="cookingcoding.beans.TestBean2"/>
<bean  class="cookingcoding.beans.DataBean3" />
<bean  class="cookingcoding.beans.DataBean4" />

단, java 코드를 통한 bean 생성에서는 위와 같은 방법의 주입이 불가하다.

 


전체코드는 요청하시면 보내드립니다

반응형