如何将bean注入范围实现?

Aar*_*lla 12 java spring scope dependency-injection

我正在编写自己的范围(即实现的类org.springframework.beans.factory.config.Scope),我需要注入一些bean.我怎么做?

背景:Spring必须首先创建所有范围bean,以便我可以定义哪些bean进入范围.但是,首先需要构建范围的bean呢?

Aar*_*lla 4

我想出了这个似乎很安全的解决方法,但我想听听评论(或者也许我的回答给你一些更好的想法):

  1. 定义范围并为其提供设置器(而不是使用@Autowired
  2. 创建一个“范围配置器”bean:

    public CustomScopeConfigurer {
        @Autowired private Foo foo;
        private CustomScope scope;
    
        public CustomScopeConfigurer( CustomScope scope ) {
            this.scope = scope;
        }
    
        @PostConstruct
        public void initScope() {
            scope.setFoo( foo );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这个配置器 bean 一定不能是懒惰的。

推理:

  1. 范围本身不能使用自动装配,因为它是在第一个 bean 之前创建的。虽然它可能稍后创建,但您可以确定它将在所有其他 bean 之前创建。所以自动装配不能可靠地工作。

  2. 配置器 bean 将与所有其他 bean 一起创建,但在范围之后。所以自动装配就可以了。

  3. 由于配置器 bean 不是延迟初始化的,因此它将在应用程序的其余部分可以看到应用程序上下文之前创建。这意味着@Scope("custom")此时还不能创建该作用域的任何 bean(即带有 的 bean) - 该作用域不能是“活动的”,但 -> Spring 还不会尝试将任何 bean 放入其中。

  4. 作用域本身通常在某处创建为静态常量。这就是为什么我们必须将它作为参数传递给构造函数。