私が持っている場合:
@Autowired private ApplicationContext ctx;
GetBeanメソッドの1つを使用して、Beanとリソースを取得できます。ただし、プロパティ値を取得する方法がわかりません。
明らかに、次のような@Valueプロパティを持つ新しいBeanを作成できます。
private @Value("${someProp}") String somePropValue;
Beanを自動配線せずにその値を取得するには、ApplicationContextオブジェクトでどのメソッドを呼び出すのですか?
私は通常@Valueを使用しますが、SPeL式を動的にする必要があるため、注釈を使用することはできません。
SPeL式を動的にする必要がある場合は、プロパティ値を手動で取得します。
somePropValue = ctx.getEnvironment().getProperty("someProp");
${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を注入し、ゲッターメソッドを介してプロパティにアクセスします。
Spring pre 3.1で立ち往生している場合は、使用できます
somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");