6.10.7 为自动检测组件提供作用域
总地来说,如同Spring管理的组件,自动检测组件的默认和最常见的作用域就是单例。但是,有时您需要其他作用域,Spring 2.5提供了新的@Scope注解。 只需在注解中提供作用域的名称:
@Scope("prototype") @Repository public class MovieFinderImpl implements MovieFinder { // ... }
若要为作用域解析提供自定义的策略而不是依赖基于注解的方法,可以实现ScopeMetadataResolver接口,并确保包含默认的无参数构造函数。然后,在配置扫描程序时提供完全限定的类名:
@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”一节中有描述。为此,component-scan元素上提供了scoped-proxy属性。三个可能的值是: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>