【问题标题】:Prevent injection of bean with narrower scope using Spring使用 Spring 防止注入范围更窄的 bean
【发布时间】:2018-11-29 12:45:47
【问题描述】:

我正在使用不同范围的 bean 开发一个 Spring 应用程序。许多 bean 是单例、其他请求或自定义范围。尤其是使用这些自定义作用域,有时很难找出哪个作用域可以安全地注入到哪个其他作用域中,或者何时注入。需要使用Provider<T>

我知道我可以为所有基本上不是单例的 bean 创建范围代理,但在许多情况下似乎没有必要。例如,一个 bean 可能只应该被注入到相同范围的其他 bean 中,但并不是每个从事该项目的人都可能意识到这一点。因此,如果能够以某种方式防止这些 bean 的“误用”,那将是一件很棒的事情,尤其是当人们可能无法始终及时发现错误时。

所以我的问题是:有没有办法定义哪个作用域可以安全地注入到 wich 作用域中,然后防止具有更窄作用域的 bean 直接(不使用 Provider<T>)被注入到例如单身豆?

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    看起来这可以使用自定义BeanPostProcessor 相当简单地实现。在postProcessBeforeInitialization 中,您可以简单地检查 bean 的范围和所有依赖项的范围。这是一个简单的例子:

    @Component
    public class BeanScopeValidator implements BeanPostProcessor {
    
      private final ConfigurableListableBeanFactory configurableBeanFactory;
    
      @Autowired
      public BeanScopeValidator(ConfigurableListableBeanFactory configurableBeanFactory) {
        this.configurableBeanFactory = configurableBeanFactory;
      }
    
      @Override
      public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        String beanScope = configurableBeanFactory.getBeanDefinition(beanName).getScope();
        String[] dependenciesForBean = configurableBeanFactory.getDependenciesForBean(beanName);
    
        for (String dependencyBeanName : dependenciesForBean) {
          String dependencyBeanScope = configurableBeanFactory.getBeanDefinition(dependencyBeanName).getScope();
    
          // TODO: Check if the scopes are compatible and throw an exception
        }
    
        return bean;
      }
    }
    

    这个例子还是很基础的,用起来不是很方便。最突出的是,它缺乏定义哪个范围可以注入哪个其他范围的能力。因此,我创建了一个更完整的示例here。使用本项目,默认允许以下注入:

    • 可以将单例注入到任何东西中
    • 一切都可以注入原型中
    • AOP 代理可以注入到任何东西中
    • 所有东西都可以注入到相同作用域的 bean 中

    如果你想允许一个 bean 被注入到另一个作用域中,它需要通过使用相应的注解来明确地允许:

    @Bean
    @Scope("prototype")
    @InjectableInto("singleton")
    MyBean getMyBean(){
      //...
    } 
    

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 2017-04-25
      • 1970-01-01
      • 2016-06-21
      • 2012-04-12
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多