ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 의 이런한 중요성을!!!

    댓글

Designed by Tistory.