web-dev-qa-db-ja.com

Spring Util:アノテーションを使用したBeanへのプロパティインジェクション

Spring XMLに2つの.propertiesファイルがセットアップされている場合:

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/>
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/>

アノテーションを介してこれらのプロパティファイルをJava.util.PropertiesでBeanに挿入するにはどうすればよいですか?

Springアノテーションを使用して特定のプロパティを取得するにはどうすればよいですか?

乾杯!

30
NightWolf
@Autowired
@Qualifier("serverProperties")
private Properties serverProperties;
@Autowired
@Qualifier("someConfig")
private Properties otherProperties;

または

@Resource(name = "serverProperties")
private Properties serverProperties;
@Resource(name = "someConfig")
private Properties otherProperties;

通常、@ AutowiredはSpringのby-type自動配線に使用され、@ Resourceはby-nameに使用されます。 @ Autowired + @ Qualifierは名前による自動配線の2倍になりますが、実際には typeを微調整 する機能を備えたby-type自動配線を対象としています。

46
Ryan Stewart

この質問には多くのヒットがあります。 SpEL(Spring Expression Language)を使用して別のオプションを指摘する価値があると思いました-特定のプロパティが必要な場合は、特定のBeanプロパティの@Valueアノテーションを使用して注入できます。

class SomeClass {
   @Value("#{serverProperties['com.svr.prop']}")
   private String aServerCfgProperty;

   @Value("#{someConfig['another.config.setting']}")
   private String someOtherProperty;
}

インデックス作成構文['index.val']を使用する必要はありません。直接取得できます。

@Value("#{someConfig}")
private Properties someConfig

@Value("#{serverProperties}")
private Properties svrProps;

これはかなり有用であることがわかり、@ Resource/@ Autowiredを介して直接注入されたプロパティオブジェクトの使用から遠ざかりました。

@Valueをインデックス付きのPropertiesオブジェクトで使用するもう1つの素晴らしい理由は、一部のIDE(例:IntelliJ)が、Niceであるプロジェクトに.propertiesファイルがある場合、実際のプロパティ名をリファクタリングできることです。別のヒントは、インクルード/ネスト/を行いたい場合、 EProperties (ネイティブJava Propertiesオブジェクトを拡張する)のようなものを使用することですSpringのPropertiesPlaceholderConfigurerクラスを使用せずにプロパティファイルで置換する(残念ながらそのプロパティは公開されません-SpELインデックスを使用するには['key']のBeanがMap<>のインスタンスである必要があります。Java Propertiesオブジェクトは))...

最後に、SpELのもう1つの便利な機能は、Beanのプロパティに直接アクセスできることです。たとえば、上記の例のSomeClassがSpring Beanであった場合、たとえばsomeClassその後、AnotherBeanClassで使用できます。

@Value("#{someClass.someOtherProperty}")
private String injectedBeanProp

ゲッターメソッドを呼び出すこともできます。

@Value("#{someClass.getSomeOtherProperty()}")
private String injectedBeanProp

こちらのSpELガイドをご覧ください。 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

16
NightWolf

@PropertySourceを使用できます

@Configuration
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"})
public class MyConfiguration {
}
2
Venky

XMlファイル

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:util="http://www.springframework.org/schema/util"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.0.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 http://www.springframework.org/schema/util 
 http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <context:component-scan base-package="com.sha.home" />
    <mvc:annotation-driven/>
    <util:properties id="dbProp" location="classpath:db.properties" />
    <!-- <context:property-placeholder location="classpath:db.properties"/> -->

</beans>

in Java file @Value( "#{dbProp}")private Properties dbProperties;

System.out.println( "urllll" + dbProperties.getProperty( "jdbc.url"));

1
sharath

ほとんどの場合、すべてのプロパティを1つのユーティリティにカプセル化し、アプリで使用します。そうすれば、アプリ層の各プロパティファイルを心配したり管理したりする必要はありません。自動配線されたsetProps(...)は、ロードしたものをすべて読み取りますtil:properties in props list.

import Java.util.List;
import Java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AppProperiesProcessor {

private List<Properties> props;
private Properties mergedProperties;

@Autowired
public final void setProps(List<Properties> props) {
    this.props = props;
}

public String getProp(final String keyVal) {

    if (null == this.mergedProperties) {
        this.mergedProperties = new Properties();

        for (Properties prop : this.props) {
            this.mergedProperties.putAll(prop);
        }
    }
    return mergedProperties.getProperty(keyVal);
  } 
}
0
mahesh