1.10.7 범위로 자동 감지되는 컴포넌트

일반적으로 Spring에서 관리하는 구성 요소와 마찬가지로 자동 감지 된 구성 요소의 기본 범위와 가장 일반적인 범위는 singleton입니다. 그러나 @Scope어노테이션에서 지정할 수있는 범위가 다른 경우가 있습니다 . 다음 예제와 같이 annotation 내의 범위 이름을 제공 할 수 있습니다.

@Scope("prototype")
@Repository
public class MovieFinderImpl implements MovieFinder {
    // ...
}

@Scope주석은 구체적인 bean 클래스 (annotation 된 component의 경우) 또는 팩토리 메소드 ( @Bean메소드의 경우) 에서만 introspect됩니다 . XML bean 정의와 달리 bean 정의 상속의 개념은 없으며 클래스 레벨의 상속 계층 구조는 메타 데이터 목적과 관련이 없습니다.

Spring 컨텍스트에서 "요청"또는 "세션"과 같은 웹 관련 범위에 대한 자세한 내용은 요청, 세션, 응용 프로그램 및 WebSocket 범위를 참조하십시오 . 이러한 스코프에 대해 사전 빌드 된 주석과 마찬가지로 Spring의 메타 주석 접근법 (예 : @Scope("prototype")사용자 정의 스코프 프록시 모드를 선언 할 수있는 메타 주석 달기 등)을 사용하여 자신의 범위 지정 주석을 작성할 수도 있습니다 .

어노테이션 기반 접근법에 의존하지 않고 범위 분석을위한 맞춤 전략을 제공하려면 ScopeMetadataResolver 인터페이스를구현할 수 있습니다. 기본 no-arg 생성자를 포함시켜야합니다. 그런 다음 주석을 설정하고 bean 정의를 표시하는 다음 예제와 같이 스캐너를 구성 할 때 정규화 된 클래스 이름을 제공 할 수 있습니다.

@Configuration
@ComponentScan(basePackages = "org.example", scopeResolver = MyScopeResolver.class)
public class AppConfig {
    ...
}
<beans>
    <context:component-scan base-package="org.example" scope-resolver="org.example.MyScopeResolver"/>
</beans>

특정 싱글 톤 범위가 아닌 특정 범위를 사용하는 경우 범위가 지정된 객체에 대한 프록시를 생성해야 할 수도 있습니다. 이유는 범위가 지정된 Bean으로 종속성에 설명되어 있습니다. 이를 위해 scoped-proxy 속성을 component-scan 요소에서 사용할 수 있습니다. : 세 가지 가능한 값은 no, interfaces하고 targetClass. 예를 들어, 다음과 같은 구성으로 인해 표준 JDK 동적 프록시가 생성됩니다.

@Configuration
@ComponentScan(basePackages = "org.example", scopedProxy = ScopedProxyMode.INTERFACES)
public class AppConfig {
    ...
}
<beans>
    <context:component-scan base-package="org.example" scoped-proxy="interfaces"/>
</beans>

Last updated