XML 설정과 @Autowired 설정이 겹쳤을때 의존주입 우선순위
스프링 어플리케이션에서 객체의 의존관계를 설정할때 XML이나 자바 코드 설정을 통해 빈을 정의하고 의존 관계를 정의할수도 있지만 @Autowired를 통한 자동 의존주입을 이용할수도 있습니다. 그렇다면 만약 XML설정에서 의존관계를 설정함과 동시에 @Autowired를 통해 자동 의존주입을 받는 경우 어떤 설정이 우선순위를 갖게 될까요?

이번글에서는 XML을 통한 명시적인 의존주입 설정과 @Autowired를 통한 자동의존주입 설정 두 가지를 적용하여 어떤 설정이 우선순위를 갖는지 테스트해보았습니다. 테스트 버전은 스프링 4.1.0 버전을 사용하였으니 참고해 주세요.


MemberDao 클래스입니다. 나중에 우선순위를 테스트하기 위해 name 속성을 하나 두었습니다.



MemberWebService이며 MemberDao를 @Autowired를 통해 자동의존주입 받습니다. 특별한점이 있다면 @Qualifier 어노테이션을 통해 명시적으로 id가 "memberDao"인 MemberDao 빈을 의존주입 받는다는 점입니다.




XML 설정
다음은 스프링 컨테이너 생성시 사용할 XML 설정입니다. <context:annotation-config />은 스프링이 관리하는 빈 사이에서 필요한 의존 객체들이 자동으로 의존주입 할수 있게 해주는 설정입니다. 즉 @Autowired나 @Qualifier등을 사용할 수 있게 해주는 설정입니다.

여기서는 세 개의 빈을 생성합니다. 두 개의 MemberDao 빈을 생성하는데, 각각 id가 memberDao와 memberDao2입니다. 각각을 구분하기 위해 name 속성으로 자신의 id값을 설정해 주었습니다.

다음으로 MemberWebService 빈인데, @Autowired를 설정함과 동시에 <constructor-arg> 를 통해 생성자를 이용해 명시적으로 memberDao2 빈을 주입시켰습니다. 이부분이 핵심인데, 이후에 memberDao가 주입될지 memberDao2가 주입될지가 포인트입니다.




테스트 클래스
테스트는 단순하게 컨테이너 생성 후 MemberWebService 빈을 얻은 후 어떤 MemberDao가 의존주입 되어있는지 확인하는 것입니다.




XML은 생성자방식으로 주입, 클래스에서 필드에서 @Autowired 사용시
현재 XML에서는 생성자방식으로 주입했고 클래스상으로는 필드에 자동의존주입 설정을 해두었습니다. 이런 경우에는 필드에 설정된 자동의존주입이 우선순위를 갖습니다. memberDao 출력




XML은 생성자방식으로 주입, 클래스에서 생성자에 @Autowired 사용시
XML에서는 생성자방식으로 의존주입을 명시하고 클래스상으로는 생성자에 자동의존주입 설정을 하는 경우에는 XML의 생성자를 통한 의존주입이 우선순위를 갖습니다. memberDao2 출력




XML은 생성자방식으로 주입, 클래스에서 setter 메서드에 @Autowired 사용시
XML에서는 생성자방식으로 의존주입을 명시하고 클래스상으로는 setter 메서드에 자동의존주입 설정을 하는 경우에는 setter 메서드에 설정된 자동의존주입이 우선순위를 갖습니다. memberDao 출력





XML 의존주입 설정을 <property>로 변경
XML에서 생성자를 통해 의존객체를 명시했던것을 <property> 를 통한 방식으로 변경했습니다.



XML은 property방식으로 주입, 클래스에서 필드에서 @Autowired 사용시
현재 XML에서는 property방식으로 주입했고 클래스상으로는 필드에 자동의존주입 설정을 해두었습니다. 이런 경우에는 XML 설정이 우선순위를 갖습니다. memberDao2 출력




XML은 property 방식으로 주입, 클래스에서 생성자에 @Autowired 사용시
XML에서는 property방식으로 의존주입을 명시하고 클래스상으로는 생성자에 자동의존주입 설정을 하는 경우에도 XML의 설정이 우선순위를 갖습니다. memberDao2 출력




XML은 property방식으로 주입, 클래스에서 setter 메서드에 @Autowired 사용시
XML에서는 property방식으로 의존주입을 명시하고 클래스상으로는 setter 메서드에 자동의존주입 설정을 하는 경우에도 XML의 설정이 우선순위를 갖습니다. memberDao2 출력




정리
즉 XML의 명시적인 의존주입 설정과 Class상에 @Autowired 등을 통한 자동의존주입시 우선순위는 다음과 같습니다. 두 가지 설정이 겹치는 경우가 분명 좋은 경우는 아닐것입니다. 다만 어쩔 수 없이 두 가지 의존주입 명시가 겹치게 되는 경우 다음의 우선순위대로 설정이 따라간다는 점을 참고정도만 해주면 될 것 같습니다.
XML 설정
빈 정의 Class 설정
결과

<constructor-arg>


필드에 @Autowired 설정
필드의 설정이 우선순위를 가짐
생성자에 @Autowired 설정
XML설정이 우선순위를 가짐
setter 메서드에 @Autowired 설정
setter의 설정이 우선순위를 가짐


<property>
필드에 @Autowired 설정
XML설정이 우선순위를 가짐
생성자에 @Autowired 설정
setter 메서드에 @Autowired 설정


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!