카테고리 없음

spring @Autowired

머룽 2023. 4. 20. 09:52
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 의 이런한 중요성을!!!