복붙노트

[SPRING] 같은 클래스에 대한 컴포넌트 스캐닝과 XML 빈 정의를 혼합 할 때의 스프링 동작?

SPRING

같은 클래스에 대한 컴포넌트 스캐닝과 XML 빈 정의를 혼합 할 때의 스프링 동작?

스프링 스캐닝 3.0.5.RELEASE에서 동일한 서비스 클래스에 대해 XML 스캐닝과 추가 빈 정의 사용에 관한 질문이 있습니다.

내가 주석으로 만든 "MyService"클래스를 만들었습니다.

@Service( "myService" )

다음과 같은 클래스에 대한 bean 정의가 있습니다 :

<bean id="myService" class="....MyService" />

나는

System.out.println( "MyService has been instantiated" );

메시지를 MyService 클래스의 생성자에 추가합니다. 이 메시지는 응용 프로그램이 시작될 때 한 번만 콘솔에 표시됩니다. Spring은 id "myService"를 가진 그 클래스의 단 하나의 인스턴스 만 존재할 수 있다는 것을 감지 할 정도로 똑똑해 보인다.

하지만 주석을

@Service( "myService2" )

XML Bean 정의 ID를 "myService"로두면 클래스는 한 번만 인스턴스화됩니다.

내 두 가지 질문은 :

도와 주셔서 정말로 고맙습니다!

해결법

  1. ==============================

    1.귀하의 질문 2. 쉽게 답변 할 수 있습니다. Spring은 범위에 따라 bean을 인스턴스화합니다. xml 또는 주석 기반 구성을 사용하는 경우 기본 범위는 "singleton"입니다. bean을 scope = prototype으로 선언하면 컨테이너가 bean을 요청할 때마다 인스턴스화됩니다.

    귀하의 질문 2. 쉽게 답변 할 수 있습니다. Spring은 범위에 따라 bean을 인스턴스화합니다. xml 또는 주석 기반 구성을 사용하는 경우 기본 범위는 "singleton"입니다. bean을 scope = prototype으로 선언하면 컨테이너가 bean을 요청할 때마다 인스턴스화됩니다.

    주석으로 :

    @Scope(StandardScopes.PROTOTYPE)
    

    XML에서 :

    <bean .... scope="prototype">
    

    정확히 두 개의 빈 인스턴스가 필요하다면 XML에서 다른 이름으로 두 개를 선언하는 것이 가장 좋습니다.

    질문 1에 관해서는 클래스의 두 인스턴스, 주석을 사용하는 인스턴스 및 XML을 사용하는 인스턴스를 선언 할 수 있는지 여부를 알 수 없습니다. 당신의 예제에서 클래스 패스 스캐닝이 실제로 작동하는지 확신합니까? XML bean 선언을 남겨두고 다시 시도하십시오. 그러면 bean 인스턴스가 있습니까? 그렇지 않으면 작동하지 않는 것으로 보이는 클래스 경로를 먼저 수정해야합니다.

    어쨌든, 가장 중요한 질문 : 왜 그렇게하고 싶습니까? 두 유형의 구성을 혼합하면 유지 보수가 불가능한 코드가 생성됩니다. 구성 유형을 혼용하지 마십시오. 단 하나만 사용하십시오. 왜 그럴 필요가 있는지 알려주십시오.

  2. ==============================

    2.구성 요소 검사를 사용할 수 있으며 동시에 xml에서 bean을 정의 할 수 있습니다. 그러나 이는 bean 범위에 달려있다.

    구성 요소 검사를 사용할 수 있으며 동시에 xml에서 bean을 정의 할 수 있습니다. 그러나 이는 bean 범위에 달려있다.

    자세한 내용은이 게시물을 읽으십시오.

  3. from https://stackoverflow.com/questions/7358825/spring-behavior-when-mixing-component-scanning-and-xml-bean-definition-for-the-s by cc-by-sa and MIT license