2

ここにあるサンプルアプリ: https://github.com/rushidesai1/Grails2_4_2_BeanIssue

質問:

次のように Bean を宣言すると、resources.groovy で

beans = {
    testObject(TestObject){bean ->
        bean.scope = "prototype"
        map = new HashMap()  // or [:]
        //And also if we declare any object like this
        testA = new TestA()
  }
}

ここで、testObject Bean を DI するか、'Holders.grailsApplication.mainContext.getBean("testObject")' を実行すると、取得する Bean にはシングルトン 'map' とシングルトン 'testA' オブジェクトが含まれます。

ここで testObject は 'prototype' として宣言されていますが、それでも 'map' と 'testA' の両方がシングルトンです。

これがバグなのか、それとも設計どおりに機能するのかを知りたいです。私たちは特に新しいことをしているので、毎回新しい Bean が注入されることを期待しているので、このように機能することは完全に直観に反しています。

ユニット テスト ケースを使用して、私の質問のより詳細なバージョンを確認してください。

明確にしていただきありがとうございます!!!

4

2 に答える 2

0

new を使用している場合でも、testA Bean を取得するたびに新しいオブジェクトを作成する必要があることと、期待どおりに機能していることは、混乱を招く可能性があります。どのように?

大丈夫!したがって、答えはSpring Java Configurationにあります。はresources.groovy、内部的に構成ファイルである DSL を使用しています。

スプリング @Configuration アノテーションについて知っているか覚えているかどうかはわかりません。これを使用して、POJO を構成ファイルにしています。Spring のルールは次のとおりです。

  1. 作成された Bean は、指定されない限り、デフォルトでシングルトンです。
  2. newJava構成ファイルで使用している場合でも。Spring は、Spring 構成ファイルであるため、常に新しいオブジェクトを意味するわけではありません。

したがって、今のところ testObject とマップをスキップした場合の同等の構成ファイルは次のとおりです。

@Configuration
public class JavaConfiguration {

    @Bean
    public Teacher teacher(){
        TestA testA =  new TestA();
        return teacher;
    }
}

ここでは、new TestA() を使用しました。ただし、スコープ プロトタイプを使用するように明示的に指定するまで、Spring は常に同じオブジェクトを返します。したがって、プロトタイプ スコープを有効にすると、上記の構成ファイルは次のようになります。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class JavaConfiguration {

    @Bean
    @Scope(value="prototype")
    public Teacher teacher(){
        TestA testA =  new TestA();
        return teacher;
    }
}

対応する DSL は次のようになります。

testA(TestA){bean->
 bean.scope='prototype'
}

それが役に立てば幸い!!

于 2016-08-25T13:26:04.143 に答える