spring Autowired
맨날 아무 생각 없이 @Autowired @Inject @Resource 이것들을 쓰다보니 그냥 의존성 주입인 줄만 알았다. 물론 틀린 말은 아니다.하지만 그게 다가 아니다.
어떤 소스중에 factory-method 쓰면서 Autowired 하지않고 getInstance를 그대로 호출 하는 소스가 있었다.
<bean id="classA" class="com.example.ClassA" factory-method="getInstance" >
private static ClassA instance = new ClassA();
public static ClassA getInstance() {
return instance;
}
대충 소스는 이것!
그럴듯한 소스이다. 뭐 저 인스턴스를 그냥 써도 무방하다.
private final ClassA classA;
@Autowired
public ClassConstructor(ClassA classA) {
this.classA= classA;
}
public void init(){
ClassA instance = ClassA.getInstance();
System.out.println(classA == instance);
}
위의 소스를 보면 우리는 true를 기대할 것이다. 맞다 true가 맞다. 우리는 기대 했던 거와 같이 true를 반환한다.
여기 까진 문제 없다.
하지만 만약 ClassA 에 @Async, @Transactional 등 AOP 관련된 설정이 있으면 말이 다르다.
private static ClassA instance = new ClassA();
public static ClassA getInstance() {
return instance;
}
@Async
public void request(){
//something
}
만약 ClassA가 이런 코드라 가정하자.
그리고 위의 소스를 다시 실행 시켜보면 이번엔 기대했던거와 달리 false를 반환한다.
실제로 classA 라는 놈안에 proxy 객체를 주입한다.
그래야 AOP 가 동작할 테니까.
Autowired은 의존성을 주입뿐만 아니라 AOP 동작을 위한 proxy 객체도 같이 주입한다.
아무 생각없이 맨날 Autowired만 쓰다보니 이런 동작하는지를 몰랐다.
기억하자 Autowired 의 이런한 중요성을!!!