cat tag


@Autowired 어노테이션 기본 설정 Spring Framework

@Autowired 이라는 단어를 그대로 풀이하자면 자동으로 와이어링을 해주겠다는 것이다.

이는 XML(ApplicationContext)에 따로 빈을 작성해서 DI해주는 작업을 하는 대신에 DI받고자 하는 객체나 메소드에 Autowired 어노테이션을 명시적으로 작성한다. Autowired 어노테이션을 객체나 메소드의 앞에 명시적으로 작성했다면 해당 객체가 DI를 받기 위해 setter 메소드를 작성해서 사용할 필요가 없다. DI를 받기 위해 존재해야 하는 것이 setter 메소드라는 존재인데 이는 XML에서 DI를 해서 빈을 넘겨주면 *.java 파일에서 빈을 받기 위해 생성자나 setter 메소드가 필요한 것인데 Autowired 어노테이션이 이 작업을 하지 않아도 된다고 알려주는 것이다.

단, Autowired 어노테이션을 사용하기 위해 XML에 별도의 설정이 필요하다.
XML(ApplicationContext)에 <context:annotation-config/> 작성


--Before--

public class BoardController {
private BoardService boardService;
public void setBoardService(BoardService boardService) {
this.boardService = boardService;
}

public BoardService getBoardService() {
return boardService;
}
...
}

<bean id="boardController" class="board.controller.BoardController">
<property name="boardService" ref="boardServiceImpl" />
</bean>
프로퍼티에 boardServiceImpl로 등록이 되어 있는데 이는 빈으로 따로 작성



--After--

public class BoardController {
@Autowired
private BoardService boardService;
...
}

<context:annotation-config/>    
<bean id="boardController" class="board.controller.BoardController"/>

DI를 받으려고 하는 bean도 작성
작성해주지 않으면 DI받으려고 할때 bean을 찾지 못한다고 에러메시지 출력
<bean id="boardServiceImpl" class="board.service.BoardServiceImpl"/>


----------------------------------------------------------------------------------------------------------------------------------------


<context:component-scan bace-package="패키지">
  <context:exclude-filter type="annotation" 
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

이와 같은 설정을 통해 @Autowired하려는 모든 빈을 등록해줄 수 있다. 
이 설정은 base-package로 등록해 놓은 패키지에 존재하는 어노테이션을 
명시해 놓은 클래스나 메소드, 변수 등을 별도의 설정이나 등록 없이 사용해 줄 수 있다. 
예를 들어 @Autowired하려는 변수에 객체를 빈을 통해 주입하는 방식을 위의 설정을 통해 
조금은 설정이 편리해진다.
빈을 DI 받기 위한 여타의 작업들을 할 수고를 덜어준다.

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.controller"/>
base-package에서 스캔을 할 때 Controller타입은 제외를 시켜주켜준다.

덧글

  • 방문객 2012/03/30 13:38 # 삭제 답글

    @Controller (@Service...) + component-scan 을 사용하면,
    <bean id="boardServiceImpl" class="board.service.BoardServiceImpl"/> 설정이 필요없습니다.
    참고하시길.
  • 진묵 2014/12/28 20:59 # 삭제 답글

    <context:component-scan bace-package="패키지">
    <context:exclude-filter type="annotation"
    expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    여기서 오타 났어요~ bace >>> base 입니다~
  • 진묵 2014/12/28 20:59 # 삭제 답글

    <context:component-scan bace-package="패키지">
    <context:exclude-filter type="annotation"
    expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    여기서 오타 났어요~ bace >>> base 입니다~
댓글 입력 영역