web-dev-qa-db-ja.com

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

私は春を使っています。プロパティファイルから値を読み込む必要があります。これは内部プロパティファイルで、外部プロパティファイルではありません。プロパティファイルは以下のようになります。

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

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

私は伝統的な方法ではなくプロパティファイルからそれらの値を読む必要があります。それを達成する方法は? Spring 3.0に関する最新のアプローチはありますか?

115
user1016403

コンテキストに合わせてPropertyPlaceholderを設定します。

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

それからあなたはあなたの豆の中のプロパティを参照します:

@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
  }
}
183
mrembisz

構成クラスで

@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;
   }
}
39
mokshino

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

  1. PropertyPlaceholderConfigurerを使う
  2. PropertySourceを使う
  3. ResourceBundleMessageSourceの使用
  4. PropertiesFactoryBeanを使う

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

ds.typeがあなたのプロパティファイルのキーであると仮定します。


PropertyPlaceholderConfigurerNAMEを使用する_

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.
 }
}

PropertySourcesPlaceholderConfigurername__を登録した後は、次の値にアクセスできます。

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

PropertySourceNAMEを使用する_

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

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

ResourceBundleMessageSourceNAMEを使用する_

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);
    }
}

PropertiesFactoryBeanNAMEを使用する_

Beanの登録 -

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

Propertiesインスタンスをクラスに配線します。

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

これが私がそれがどのように働いていたかを理解するのに非常に助けになった追加の答えです: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

beanFactoryPostProcessor Beanは、static修飾子を使用して宣言する必要があります。

@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();
 }
}
25

@Valueを使わずに手動でプロパティファイルを読む必要がある場合

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

enter image description here

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;
    }
}
7
John

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

ここに詳細を見なさい: http://www.zparacha.com/how-to-read-properties-file-in-spring/

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

それが役に立てば幸い。

6

別の方法は ResourceBundle を使うことです。基本的には '.properties'なしでその名前を使ってバンドルを取得します

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

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

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

私はこのリンクを読むことをお勧めします https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html SpringBootのドキュメントにある外部設定の注入について。彼らはプロパティファイルから取得することについて話しただけでなく、YAMLやJSONファイルさえも話しました。参考になりました。私もあなたがそうすることを望みます。

0
Josh Uzo
 [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>
0
Sangram Badi