JSR-330 @Scope 和 Spring 不匹配
JSR-330 @Scope and Spring Don't Match
JSR-330 Scope 注释的 java 文档声明 "uses the instance for one injection, and then forgets it" 暗示该实例是范围原型并且 Singleton 注释旨在创建作为默认行为的单例 spring。所以问题是,为什么当我使用 Named 注释而不是 Spring Component 注释时 Spring 不遵循 JSR 指南并将 bean 范围限定为原型?在我看来应该如此。
我想将 spring 依赖项合并到一个模块中,并在其他任何地方使用 JSR-330,以便以后需要时可以轻松切换。
这就是我实现我想要的效果的方式:
/**
* 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模块来处理这个注解。
它对我来说效果很好,但我很高兴听到任何其他建议。
JSR-330 Scope 注释的 java 文档声明 "uses the instance for one injection, and then forgets it" 暗示该实例是范围原型并且 Singleton 注释旨在创建作为默认行为的单例 spring。所以问题是,为什么当我使用 Named 注释而不是 Spring Component 注释时 Spring 不遵循 JSR 指南并将 bean 范围限定为原型?在我看来应该如此。
我想将 spring 依赖项合并到一个模块中,并在其他任何地方使用 JSR-330,以便以后需要时可以轻松切换。
这就是我实现我想要的效果的方式:
/**
* 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模块来处理这个注解。
它对我来说效果很好,但我很高兴听到任何其他建议。