web-dev-qa-db-ja.com

ApplicationContextオブジェクトからプロパティ値を取得するにはどうすればよいですか? (注釈を使用しない)

私が持っている場合:

@Autowired private ApplicationContext ctx;

GetBeanメソッドの1つを使用して、Beanとリソースを取得できます。ただし、プロパティ値を取得する方法がわかりません。

明らかに、次のような@Valueプロパティを持つ新しいBeanを作成できます。

private @Value("${someProp}") String somePropValue;

Beanを自動配線せずにその値を取得するには、ApplicationContextオブジェクトでどのメソッドを呼び出すのですか?

私は通常@Valueを使用しますが、SPeL式を動的にする必要があるため、注釈を使用することはできません。

39
HappyEngineer

SPeL式を動的にする必要がある場合は、プロパティ値を手動で取得します。

somePropValue = ctx.getEnvironment().getProperty("someProp");
47
Italo Borssatto

${someProp}プロパティは、物事を難しくするPropertyPlaceHolderConfigurerから取得されます。 PropertyPlaceholderConfigurerはBeanFactoryPostProcessorであるため、コンテナーの起動時にのみ使用可能です。そのため、プロパティは実行時にBeanで使用できません。

解決策は、必要なプロパティで初期化するある種のバリューホルダーBeanを作成することです。

@Component
public class PropertyHolder{

    @Value("${props.foo}") private String foo;
    @Value("${props.bar}") private String bar;

    // + getter methods
}

プロパティが必要な場所にこのPropertyHolderを注入し、ゲッターメソッドを介してプロパティにアクセスします。

15

Spring pre 3.1で立ち往生している場合は、使用できます

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");
10
Asa