2016-09-19 13 views
0

私は、Springブートからいくつかの自動設定クラスを調べます。 はLiquibaseAutoConfiguration.classでは、私はLiquibasePropertiesがautowiredされていることに気づいたとnew演算子を使用して作成し、同時に:@Autowiredを新しいキーワードで使用する際のポイントは何ですか?

@Autowired 
    private LiquibaseProperties properties = new LiquibaseProperties(); 

    @Autowired 
    private ResourceLoader resourceLoader = new DefaultResourceLoader(); 

これは、すべての設定クラスには適用されません、私はまた、JooqAutoConfigurationでこれを気づきました。なぜnew演算子がここで使用されるのですか?

答えて

0

オブジェクトの構成について考えると、new演算子が使用されていない場合、そのフィールドがNULLになる期間があります。マネージドBeanのライフサイクルを示すダイアグラムを見つけようとしましたが、コールバック(Spring Reference)のドキュメントのみが見つかりました。

通常、SpringはデフォルトのコンストラクタでBeanをインスタンス化し、オブジェクトに対して「通常の」処理を行います(フィールドの初期化)。したがって、この場合、フィールドにはこれらのフィールドのクラスの新しいインスタンスが割り当てられます。その後、SpringはApplicationContext内で管理されているクラスのインスタンスに基づいてフィールドをオートワイヤします。

これは奇妙に見えますが、Springがオートワイヤリングを実行する前に、デフォルトのプロパティとリソースローダオブジェクトが存在しなければならないクラス内の初期化が原因である可能性があります。

3

@Autowired(required=false)で実際に使用されています。その場合、newによって作成されたインスタンスは、インスタンスが注入に使用できない場合にはデフォルト値として使用されます。

注入されたインスタンスが常に必要なため、newで作成されたインスタンスは注入されたインスタンスに置き換えられるか、注入するインスタンスがない場合は失敗します。要するに、冗長でコードは次のように書くことができます:

スプリングブート1.4はコンストラクタインジェクションに移動することでこれを修正しました。コンフィグレーションクラスでのコンストラクタインジェクションのサポートは、Spring Framework 4.3で導入されました。 code in questionは、フィールドをfinalと宣言し、その値をコンストラクターに割り当てます。

関連する問題