プロパティファイルから値を読み取る方法は?


133

春を使用しています。プロパティファイルから値を読み取る必要があります。これは、外部プロパティファイルではなく、内部プロパティファイルです。プロパティファイルは以下のようになります。

some.properties ---file name. values are below.

abc = abc
def = dsd
ghi = weds
jil = sdd

従来の方法ではなく、プロパティファイルからこれらの値を読み取る必要があります。それを達成する方法は?Spring 3.0の最新のアプローチはありますか?


7
これはプロパティファイルのようには見えません。
Raghuram

Javaの意味でのプロパティファイルの場合-はい。それ以外の場合は、別の方法で処理する必要のあるカスタムファイル形式です(キーがない場合、Springで行をプロパティ値として使用することはできません)。
Hauke Ingmar Schmidt

3
「伝統的な方法ではない」-これはどういう意味ですか?
Hauke Ingmar Schmidt

xml設定ではないアノテーションを使用することを意味します...
user1016403

回答:


196

コンテキストでPropertyPlaceholderを構成します。

<context:property-placeholder location="classpath*:my.properties"/>

次に、Beanのプロパティを参照します。

@Component
class MyClass {
  @Value("${my.property.name}")
  private String[] myValues;
}

編集:複数のカンマ区切り値でプロパティを解析するようにコードを更新しました:

my.property.name=aaa,bbb,ccc

それが機能しない場合は、プロパティを使用してBeanを定義し、手動で挿入して処理できます。

<bean id="myProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath*:my.properties</value>
    </list>
  </property>
</bean>

そして豆:

@Component
class MyClass {
  @Resource(name="myProperties")
  private Properties myProperties;

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}

こんにちはmrembisz、返信ありがとうございます。外部プロパティファイルから値を読み取るようにプロパティプレースホルダーをすでに構成しています。しかし、resourcesフォルダー内に1つのプロパティファイルがあります。私は読んで注入する必要があります。すべての値をリストに挿入する必要があります。ありがとう!
user1016403

@Ethanの提案に従って編集。更新していただきありがとうございます。元の編集を受け入れることができませんでした。すでに遅すぎました。
mrembisz 2013年

2
あなたはカンマを扱っている場合の値はおそらくELを使用して、ここで提案されているかを考え区切ら:stackoverflow.com/questions/12576156/...
arcseldon

2
どのように使用しaaaますか?それは@Value(${aaa}) private String aaa;私達ができるその後、System.out.println(aaa)???????

2
@ user75782131より正確に@Value("${aaa}")は、引用符を気にしてください。そして、はい、値が挿入される前にコンストラクターが実行されるため、コンストラクター内以外では印刷できます。
mrembisz 2014

48

同じことを達成するためのさまざまな方法があります。以下は、春によく使われる方法です。

  1. PropertyPlaceholderConfigurerの使用

  2. PropertySourceの使用

  3. ResourceBundleMessageSourceの使用

  4. PropertiesFactoryBeanの使用

    などなど........................

仮定ds.typeは、プロパティファイルのキーです。


使用する PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurerBeanを登録する

<context:property-placeholder location="classpath:path/filename.properties"/>

または

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="classpath:path/filename.properties" ></property>
</bean>

または

@Configuration
public class SampleConfig {
 @Bean
 public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
  //set locations as well.
 }
}

登録後PropertySourcesPlaceholderConfigurer、値にアクセスできます

@Value("${ds.type}")private String attr; 

使用する PropertySource

に登録PropertyPlaceHolderConfigurerする必要のない最新の春バージョンでは@PropertySource、バージョンの互換性を理解するための良いリンクを見つけました-

@PropertySource("classpath:path/filename.properties")
@Component
public class BeanTester {
    @Autowired Environment environment; 
    public void execute() {
        String attr = this.environment.getProperty("ds.type");
    }
}

使用する ResourceBundleMessageSource

Beanを登録-

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames">
    <list>
      <value>classpath:path/filename.properties</value>
    </list>
  </property>
</bean>

アクセス値-

((ApplicationContext)context).getMessage("ds.type", null, null);

または

@Component
public class BeanTester {
    @Autowired MessageSource messageSource; 
    public void execute() {
        String attr = this.messageSource.getMessage("ds.type", null, null);
    }
}

使用する PropertiesFactoryBean

Beanを登録-

<bean id="properties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath:path/filename.properties</value>
    </list>
  </property>
</bean>

クラスにWire Propertiesインスタンスを

@Component
public class BeanTester {
    @Autowired Properties properties; 
    public void execute() {
        String attr = properties.getProperty("ds.type");
    }
}

PropertySourcesPlaceholderConfigurerを使用するには、通常、場所またはリソースを設定する必要があります。そうしないと、プロパティファイルにアクセスできません。たとえば、ClassPathResource generalProperties = new ClassPathResource( "general.properties");を使用できます。
M46

43

構成クラス内

@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
   @Autowired
   Environment env;

   @Bean
   public TestBean testBean() {
       TestBean testBean = new TestBean();
       testBean.setName(env.getProperty("testbean.name"));
       return testBean;
   }
}

この例では、単にapp.properties本番環境とテストで異なるものを使用しますか?言い換えれば、導入プロセスの一部はapp.properties本番値に置き換えることですか?
ケビンメレディス

1
はい@KevinMeredith、あなたは、単にプロファイル注釈して、春の設定を分割することができますstackoverflow.com/questions/12691812/...
mokshino

@KevinMeredith c:\ apps \ sys_name \ conf \ app.propertiesのような、展開warの外部のフォルダーを使用します。展開プロセスが簡素化され、エラーが発生しにくくなります。
jpfreire 2016

27

以下は、それがどのように機能するかを理解するのにも非常に役立つ追加の回答です。http//www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

BeanFactoryPostProcessor Beanは、静的修飾子で宣言する必要があります

@Configuration
@PropertySource("classpath:root/test.props")
public class SampleConfig {
 @Value("${test.prop}")
 private String attr;
 @Bean
 public SampleService sampleService() {
  return new SampleService(attr);
 }

 @Bean
 public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
 }
}

PropertySourcesPlaceholderConfigurerBean を明示的に登録する必要はありません@PropertySource

@ dubey-theHarcourtians使用しているSpring(コア)バージョンは?Spring Bootを使用している場合は、@PropertySourceまったく必要ありません。
MichaelTécourt2017年

11

@Valueを使用せずにプロパティファイルを手動で読み取る必要がある場合。

Lokesh Guptaによるよく書かれたページをありがとう:ブログ

ここに画像の説明を入力してください

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}

おかげで、私の場合はうまくいきます。静的関数からプロパティを読み取る必要があります。
Trieu Nguyen

6

PropertyPlaceholderConfigurer Beanをアプリケーションコンテキストに配置し、そのロケーションプロパティを設定する必要があります。

詳細はこちら:http : //www.zparacha.com/how-to-read-properties-file-in-spring/

これを機能させるには、プロパティファイルを少し変更する必要がある場合があります。

それが役に立てば幸い。


4

別の方法は、ResourceBundleを使用することです。基本的に、「。properties」なしでその名前を使用してバンドルを取得します

private static final ResourceBundle resource = ResourceBundle.getBundle("config");

そして、あなたはこれを使ってどんな価値も回復します:

private final String prop = resource.getString("propName");

0
 [project structure]: http://i.stack.imgur.com/RAGX3.jpg
-------------------------------
    package beans;

        import java.util.Properties;
        import java.util.Set;

        public class PropertiesBeans {

            private Properties properties;

            public void setProperties(Properties properties) {
                this.properties = properties;
            }

            public void getProperty(){
                Set keys = properties.keySet();
                for (Object key : keys) {
                    System.out.println(key+" : "+properties.getProperty(key.toString()));
                }
            }

        }
    ----------------------------

        package beans;

        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;

        public class Test {

            public static void main(String[] args) {
                // TODO Auto-generated method stub
                ApplicationContext ap = new ClassPathXmlApplicationContext("resource/spring.xml");
                PropertiesBeans p = (PropertiesBeans)ap.getBean("p");
                p.getProperty();
            }

        }
    ----------------------------

 - driver.properties

    Driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/test
    username = root
    password = root
    ----------------------------



     <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:util="http://www.springframework.org/schema/util"
               xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

            <bean id="p" class="beans.PropertiesBeans">
                <property name="properties">
                    <util:properties location="classpath:resource/driver.properties"/>
                </property>
            </bean>

        </beans>

説明を追加
HaveNoDisplayName

あなたはApplicationContextのようなJ2EEコンテナを使用する必要があるので、あなたがアクセス外のリソースプロパティファイルできないコアの容器を使用して、あなたは豆にのxmlns、のxmlnsのようなレベルの検証を使用する必要があります。UTIL、XSI:schemaLocationの、のxmlns:XSI
Sangramバディ


0

Springで管理されていないユーティリティクラスが必要だったため@Component@ConfigurationなどのSpringアノテーションは必要ありませんでした。application.properties

私は、クラスにSpring Contextを認識させ、それによりを認識させ、期待どおりに機能させることでEnvironment、なんとか機能させることができましたenvironment.getProperty()

明確にするために、私は:

application.properties

mypath=somestring

Utils.java

import org.springframework.core.env.Environment;

// No spring annotations here
public class Utils {
    public String execute(String cmd) {
        // Making the class Spring context aware
        ApplicationContextProvider appContext = new ApplicationContextProvider();
        Environment env = appContext.getApplicationContext().getEnvironment();

        // env.getProperty() works!!!
        System.out.println(env.getProperty("mypath")) 
    }
}

ApplicationContextProvider.javaSpring get current ApplicationContextを参照)

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext CONTEXT;

    public ApplicationContext getApplicationContext() {
        return CONTEXT;
    }

    public void setApplicationContext(ApplicationContext context) throws BeansException {
        CONTEXT = context;
    }

    public static Object getBean(String beanName) {
        return CONTEXT.getBean(beanName);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.