열정가이
70
2018-12-06 16:25:23
7
136

spring bean관련 질문이 있습니다!


Spring을 이제 입문하는 초보자입니다 ㅠ

토비에서는 DI를 제대로 사용하기 위해서는 사용할 class와 해당되는 메타정보가 필요하다고 알고있습니다...사실 이것도 정확하지 않습니다..

그러나 지금 공부를 하는 과정에서 아래과 같은 코드가 있을 때,


@Controller

public class A {

@Resource(name = "B")

private B loginService;

}

이때 B에 대한 메타데이터가 어딘가에 무조건 등록되어있어야 하는거 아닌가요?ㅠ

B는 그냥 어떠한 어노테이션도 없는 인터페이스입니다 ㅠ

근데 아무리 찾아봐도 해당 정보를 저장한 xml이 없습니다 ㅠ

0
0
  • 답변 7

  • 포포핀
    449
    2018-12-06 16:36:20

    정확히는 B라는 이름의 spring bean을 찾는건데요 

    bean 등록은 xml 뿐만아니라 

    java나 애노테이션으로 등록할수있습니다. 잘 찾아보시고요

    그리고 @Resource는 이름으로 못 찾을경우 B 타입으로 찾는걸로 알고있습니다.

    1
  • 열정가이
    70
    2018-12-06 16:43:48

    그렇다면 제가 못찾은게 맞는거죠?

    제가 이해한게 맞나요?

    spring에서 DI를 사용하기 위해서는 해당 class와 메타정보가 필요하며, 이러한 메타정보는 xml, java, 애노테이션으로 등록할 수 있다. 이렇게 생성된 오브젝트를 bean이라고 한다.

    이게 맞나요?!

    0
  • 포포핀
    449
    2018-12-06 16:54:46

    resource같은 auto-scan DI는 타입이나 이름만 알면 알아서 DI가 되고요..

    메타정보로 등록된 스프링컨테이너가 관리하는 객체를 bean이라고 해요

    B가 인터페이스라면 이름을 못찾았을 때 B의 구현 클래스가 DI 될거에요

    B의 구현클래스가 2개이상이면 오류가 날거구요

    1
  • 열정가이
    70
    2018-12-06 17:12:49

    감사합니다 ㅠㅠ

    정말 초보라 그런데 resource같은 auto-scan DI타입이라는게 뭔가요?ㅠㅠ

    <context:component-scan base-package="xxx">

    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>

    <context:exclude-filter expression="org.springframework.stereotype.Service" type="annotation"/>

    <context:exclude-filter expression="org.springframework.stereotype.Repository" type="annotation"/>

    </context:component-scan>


    scan으로 검색하니까 xml파일에 이런 코드가 있기는 하던데 이게 DI를 자동으로 생성하는건가요?!
    0
  • 포포핀
    449
    2018-12-06 17:17:53 작성 2018-12-06 17:18:54 수정됨

    component-scan은 어노테이션 정보를 찾아서 Bean을 등록하라는거에요

    @Controller, @Service, @Repository 애노테이션이 달린 클래스를 찾아서 빈으로 등록해라~는 겁니당

    1
  • 열정가이
    70
    2018-12-06 17:25:47

    감사합니다 ㅠㅠㅠ 많은 도움이 됐습니다 정말!!

    0
  • 엔카나
    319
    2018-12-06 19:13:01

    <context:component-scan base-package="xxx">

    -> base-package 에 설정된 패키지에 있는 (+@컴포넌트,@컨트롤러,@리포지스토리 어노테이션이 달린) 클래스를 스프링 빈으로 등록해라.


    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>

    -> Controller 어노테이션이 달린 클래스는 자동 빈 등록에 포함시켜라.


    <context:exclude-filter expression="org.springframework.stereotype.Service" type="annotation"/>

    -> Service 어노테이션이 달린 클래스는 스캔 대상에서 제외시켜라.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.