프로그래밍/Spring

[Spring] 어노테이션 장점과 @Autowired 이용한 DI

Spring을 사용시 다양한 어노테이션을 지원한다.

그 중 Spring을 이용한 DI를 편리하게 설정하는 어노테이션도 지원하는데

그게 바로 @Autowired 이다.

기존 DI의 결합도를 낮추기 위해  인터페이스를 호출하고 해당 구현체들의 클래스를 어떤 구분 값으로

외부 설정 파일(XML,TXT 등)을 통해 Class를 바꿔끼워주었다.

setting.txt

com.study.di.A1

 

FileinputStream fis = new FileinputStream("/com/study/di/setting.txt")

String className = fis.readLine(); 

A a = Class.forName(className)

 

Spring에서도 

ApplicationContext 객체를 통해 외부 Xml에서 작성한 bean설정들을 호출해 결합도를 해소할 수 있지만 

@Autowired 어노테이션을 통해 DI를 간편하게 설정할 수 있게 지원한다.

 

@Autowired는

주입 받는 객체의 타입에 참조가 가능한 빈을 찾아서 자동으로 주입해준다.

예를들어 Book Interface룰 주입받는 lib 클래스에서 

setter를 통해 book을 주입받을때

 

@Autowired

public void setBook(Book book){

this.book = book;

}

application-context

...

<bean class="package..book1/>

bean 의 특정 id가 아닌 Book 터페이스에 참조가능한 클래스인지를 확인하는 것이다. 

 

그렇다면 book의 구현체가 book1뿐만아니라 book2도 있는 경우에는 어떻게 될까?

application-context

...

<bean id ="book" class="package..book1/>

<bean id ="book1" class="package...book2/>

 

이런 경우에는 자동적을 DI가 불가능하므로 에러가 발생한다.

이처럼 DI가 가능한 빈들이 여러개일 경우 

id로 특정할 수 있게하는 어노테이션이 

@Qualifer이다.

 

lib 클래스에서 

book을 주입받는 setter메소드에 

@Qualifer("bean id")를 작성하면 

해당 id를 가진 bean을 Autowired한다.

@Autowired

@Qualifer("book1")

public void setBook(Book book){

this.book = book;

}

해당 코드인경우 'book1' 인 빈을 book필드에 주입한다. 

 

 

 

 

 

 

728x90