2020. 8. 24. 22:30ㆍJava/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 생성에서는 위와 같은 방법의 주입이 불가하다.
전체코드는 요청하시면 보내드립니다
'Java > Spring' 카테고리의 다른 글
Spring - Component (0) | 2020.08.26 |
---|---|
Spring - JSR-250 어노테이션 (0) | 2020.08.25 |
Spring - Java를 이용한 주입(생성자,getter,autowire) (0) | 2020.08.20 |
Spring - Java를 이용한 init-method, destroy-method (0) | 2020.08.19 |
Spring - Java를 이용한 Bean 등록(어노테이션) (0) | 2020.08.18 |