JSR-330 Scope注释的java文档说明"使用实例进行一次注入,然后忘记它"暗示该实例是范围原型,而Singleton注释旨在创建使用spring的默认行为的单例。所以问题是,为什么,当我使用Named注释而不是Spring Component注释时,Spring是否遵循JSR指南并将bean作为原型范围?在我看来它应该是这样。
我想将spring依赖项合并到一个模块中,并在其他地方使用JSR-330,以便我可以在以后轻松切换。
答案 0 :(得分:0)
所以这就是我做我想要的工作方式:
/**
* JSR-330 assumes the default scope is prototype, however Spring IOC defaults to singleton scope.
* This annotation is used to force the JSR-330 standard on the spring application.
*
* This is done by registering this annotation with the spring bean factory post processor.
* <pre>
* <code>
* public class PrototypeBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
*
* public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
* for (String beanName : factory.getBeanDefinitionNames()) {
* if (factory.findAnnotationOnBean(beanName, Prototype.class) != null) {
* BeanDefinition beanDef = factory.getBeanDefinition(beanName);
* beanDef.setScope("prototype");
* }
* }
* }
* }
* </code>
* </pre>
*
* @see javax.inject.Scope @Scope
*/
@Scope
@Documented
@Retention(RUNTIME)
public @interface Prototype {}
我把这个注释放在我的核心jar中,然后让spring-boot app模块完成处理注释的工作。
它适合我,但我很高兴听到任何其他建议。