JSR-330 @Scope и Spring не совпадают

Документ Java для состояний аннотации области JSR-330 "использует экземпляр для одной инъекции, а затем забывает его", подразумевая, что экземпляр имеет прототип области действия, а аннотация Singleton предназначена для создания сингтона, который является поведением по умолчанию с пружиной. Итак, вопрос в том, почему, когда я использую аннотацию Named, а не аннотацию Spring Component, Spring не следует рекомендациям JSR и не использует бин как прототип? Мне кажется, так и должно быть.

Я хотел бы объединить пружинные зависимости в один модуль и использовать JSR-330 везде, поэтому при необходимости я могу легко переключиться позже.

1 ответ

Решение

Так вот как я сделал то, что я хочу работать:

/**
 * 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 {}

Я поместил эту аннотацию в свою базовую флягу и затем позволил модулю приложения spring-boot выполнить обработку аннотации.

Это хорошо работает для меня, но я рад услышать любые другие предложения.

Другие вопросы по тегам