JAVA 기반의 웹서비스 개발을 하는 사람이라면 Spring을 떼어낼 수 없습니다. 그리고 누구나 @Autowired를 최소한 한 번쯤은 사용하고 있습니다. 하지만 보통 크게 관심을 갖지 않으면 “IoC 개념을 구현한 Spring-Container의 Dependency-Injection을 사용했다.” 라는 정도만 숙지하고 사용하게 됩니다. 바로 아래의 가장 초보적인 예제로 말이죠.
ex) 가장 초보적인 @Autowired 사용예제.
public class MyTest {
@Autowired MyService1 myService1;
}
조금 익숙해 지게 되면 다음과 같이 constructor 또는 setter 를 사용하여 확장하게 됩니다. @Autowired 는 기본적으로 byType으로 bean을 찾고 못 찾으면 byName으로 찾습니다. 그리고 필수적인 속성들은 생성자로 그렇지않은 것은 메서드로 생성하기도 합니다.
ex) constructor 또는 setter 를 사용한 @Autowired 사용예제.
public class MyTest {
MyService2 myService2;
MyService3 myService3;
@Autowired
public MyTest(MyService2 myService2) {
this.myService2 = myService2;
}
@Autowired(required=false)
public void setMyService3(MyService3 myService3) {
this.myService3 = myService3;
}
}
우리가 이와 같이 사용하는 Spring의 @Autowired 와 관련있는 DI 의 히스토리와 개념에 대해 짚고 넘어 가도록 하겠습니다. IoC(Inversion of Control)의 한 형태인 DI(Dependency-Injection)는 2004년부터 자바개발의 중요한 프로그래밍 패러다임이 되었습니다. Spring 뿐만 아니라 Guice 프레임워크 등에서 DI를 구현해 왔는데요. 다양한 프레임워크에서 각자의 방향으로 발전하다가 SpringSource의 Rod-Johnson 과 Guice 를 발표한 Bob-Lee가 2009년5월 함께 표준-DI 인터페이스 JSR-330을 작업하기로 발표한 후 몇 달만에 final을 내놓게 되었습니다..(링크)
Martin-Fowler 의 말을 빌리면 IoC 는 Concept 이고 DI는 Pattern 이라는 설명을 하기도 했고, IoC 를 실제 구현한 것들이 DI를 포함하여 많은 분들께 익숙한 Factory-Pattern과 Service-Locator-Pattern 등이 있습니다.
... ING~~
PrototypeBean의 Dependency-Lookup 의 전략들..
1. ObjectFactory
2. ServiceLocatorFactoryBean
3. Provider<T>
4. @Lookup