18

私はこれをやっています。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
xmlReader
        .loadBeanDefinitions(new ClassPathResource("SpringConfig.xml"));
PropertySourcesPlaceholderConfigurer propertyHolder = new PropertySourcesPlaceholderConfigurer();
propertyHolder.setLocation(new ClassPathResource(
        "SpringConfig.properties"));
context.addBeanFactoryPostProcessor(propertyHolder);

    ......

context.refresh();

@Configurationファイルで、これを実行してもSpringConfig.propertiesに存在するプロパティが取得されません...

@Autowired
private Environment env
.....
env.getProperty("my.property")

しかし、私が使用すると、そのプロパティを取得します

@Value("${my.property}")
private String myProperty;

このようにさらに数行追加してみましたが、役に立ちませんでした。

ConfigurableEnvironment env = new StandardEnvironment();
propertyHolder.setEnvironment(env);

私のプロパティがEnvironmentにロードされない理由を誰かが知っていますか?ありがとう。

4

4 に答える 4

16

PropertySourcesPlaceholderConfigurerはプロパティファイルを直接読み取ります(Spring 3.0回でPropertyPlaceholderConfigurerによって行われたように)。これは、Springコンテキストでのプロパティの使用方法を変更しない単なるポストプロセッサーです。この場合、プロパティはBean定義プレースホルダーとしてのみ使用できます。

環境を使用するのはPropertySourcesPlaceholderConfigurerであり、その逆はありません。

プロパティソースフレームワークはアプリケーションコンテキストレベルで機能しますが、プロパティプレースホルダーコンフィギュレーターは、Bean定義内のプレースホルダーを処理する機能のみを提供します。プロパティソースの抽象化を使用するには、@PropertySourceアノテーションを使用する必要があります。つまり、構成クラスを次のようなもので装飾します。 @PropertySource("classpath:SpringConfig.properties")

プログラムで同じことを行うことができると思います。つまり、コンテキストが更新される前にコンテナのConfigurableEnvironmentを取得し、MutablePropertySources(最初にを介してプロパティを取得する必要があります )をAbstractApplicationContext environment変更することができますが、それはあなたがやりたいことではありません-すでに持っている場合注釈付きのクラスは、それを飾るのがはるかに簡単です。context.getEnvironment()getPropertySources().addFirst(new ResourcePropertySource(new ClassPathResource( "SpringConfig.properties")));@Configuration@PropertySource("classpath:SpringConfig.properties")

インスタンスに関してはPropertySourcesPlaceholderConfigurer、アプリケーションコンテキストからプロパティソースを自動的に(EnvironmentAwareを実装しているため)フェッチするため、デフォルトのインスタンスを登録するだけで済みます。

カスタムプロパティソースの実装例については、http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/を参照してください。

于 2013-01-05T08:51:19.257 に答える
3

ローカルプロパティをPropertySourcesPlaceholderConfigurersetProperties()または)に追加setLocation()しても、で使用できるようにはなりませんEnvironment

実際には、逆の方法でEnvironment機能します-プロパティの主要なソースとして機能し(を参照ConfigurableEnvironment)、構文を使用して利用可能なPropertySourcesPlaceholderConfigurerプロパティを作成できます。Environment${...}

于 2013-01-05T08:50:51.190 に答える
1

私は@Borisの提案に従ってこれを行いました。

    PropertySourcesPlaceholderConfigurer propertyHolder = new PropertySourcesPlaceholderConfigurer();
    ConfigurableEnvironment env = new StandardEnvironment();
    env.getPropertySources().addFirst(
            new ResourcePropertySource(new ClassPathResource(
                    "SpringConfig.properties")));
    propertyHolder.setEnvironment(env);
    context.addBeanFactoryPostProcessor(propertyHolder);
            context.register(SpringConfig.class);
            context.refresh();

これで、@ Configurationクラスで、すべてのプロパティ(自分のプロパティとシステムプロパティを含む)を@Valueを使用して解決できます。

ただし、@ Autowiredを@Configurationクラスに取り込む環境には、システムプロパティのみが含まれ、上記のように設定したSpringConfig.propertiesは含まれていません。しかし、明らかに、context.refresh()上記を呼び出す前に、にConfigurableEnvironmentは私のプロパティもあります。しかし、一度context.refresh()呼び出されると、私のプロパティは@Configurationに自動配線される環境から削除されます。

より良い構文env.getProperty( "my.property")を使用できるようにしたいと思います。なぜそうなるのか誰か知っていますか?

于 2013-01-05T18:59:09.433 に答える
0

2種類のプロパティを読み込んでいます。1つはEnvironmentプロパティで、もう1つは通常から取得するコンテキストですservletContext.getServletContext()。私の環境プロパティは次のように定義されています:MOD_CONFIG_ROOTこれは環境上で個別に設定され、それによってコードを含むearファイルの場所の詳細を分離します。構成は次のとおりです。[注:サーブレットをロードする前に、最初にプロパティファイルをロードして、${someProperty}]を使用してプロパティを使用する必要がありました。

<bean id="externalProperties"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>file:#{ systemEnvironment['MOD_CONFIG_ROOT']
                }#{servletContext.contextPath}/users.properties</value>
        </list>
    </property>
    <property name="searchSystemEnvironment" value="true" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_FALLBACK" />
</bean>
于 2014-10-24T22:28:29.970 に答える