Bagaimana cara membaca nilai dari file properti?

133

Saya menggunakan pegas. Saya perlu membaca nilai dari file properti. Ini adalah file properti internal bukan file properti eksternal. File properti bisa seperti di bawah ini.

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

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

Saya perlu membaca nilai-nilai itu dari file properti bukan dengan cara tradisional. Bagaimana cara mencapainya? Apakah ada pendekatan terbaru dengan spring 3.0?

pengguna1016403
sumber
7
Ini tidak terlihat seperti file properti .
Raghuram
Jika itu adalah file properti dalam arti Java - ya. Kalau tidak, itu adalah format file khusus yang perlu diperlakukan berbeda (dan Anda tidak bisa hanya menggunakan baris sebagai nilai properti di Spring jika mereka tidak memiliki kunci).
Hauke ​​Ingmar Schmidt
3
"Tidak dengan cara tradisional" - apa maksudmu dengan ini?
Hauke ​​Ingmar Schmidt
maksud saya menggunakan
anotasi..bukan

Jawaban:

196

Konfigurasikan PropertyPlaceholder dalam konteks Anda:

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

Kemudian Anda merujuk ke properti di kacang Anda:

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

EDIT: memperbarui kode ke properti parse dengan nilai yang dipisahkan koma mutliple:

my.property.name=aaa,bbb,ccc

Jika itu tidak berhasil, Anda dapat mendefinisikan kacang dengan properti, menyuntikkan dan memprosesnya secara manual:

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

dan kacang:

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

  @PostConstruct
  public void init() {
    // do whatever you need with properties
  }
}
mrembisz
sumber
Hai mrembisz, Terima kasih atas balasan Anda. saya sudah mengkonfigurasi propert-placeholder untuk membaca nilai dari file properti eksternal. tetapi saya punya satu properti file di dalam folder sumber daya. saya perlu membaca dan menyuntikkan. saya perlu menyuntikkan semua nilai ke dalam daftar. Terima kasih!
user1016403
Diedit seperti yang disarankan oleh @Ethan. Terima kasih telah memperbarui, tidak dapat menerima suntingan asli, sudah terlambat.
mrembisz
2
Untuk kasus di mana Anda berurusan dengan nilai-nilai yang dipisahkan koma, mungkin mempertimbangkan apa yang diusulkan di sini dengan menggunakan EL: stackoverflow.com/questions/12576156/…
arcseldon
2
Bagaimana kita menggunakan aaa? Apakah @Value(${aaa}) private String aaa;kemudian kita dapat System.out.println(aaa)???????
2
@ user75782131 Lebih tepatnya @Value("${aaa}"), ingat tanda kutip. Dan ya, Anda bisa mencetaknya kecuali di konstruktor karena konstruktor dieksekusi sebelum nilai disuntikkan.
mrembisz
48

Ada berbagai cara untuk mencapai hal yang sama. Di bawah ini adalah beberapa cara yang umum digunakan di musim semi-

  1. Menggunakan PropertyPlaceholderConfigurer

  2. Menggunakan PropertySource

  3. Menggunakan ResourceBundleMessageSource

  4. Menggunakan PropertiesFactoryBean

    dan masih banyak lagi........................

Dengan asumsi ds.typeadalah kunci dalam file properti Anda.


Menggunakan PropertyPlaceholderConfigurer

Daftar PropertyPlaceholderConfigurerkacang

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

atau

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

atau

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

Setelah mendaftar PropertySourcesPlaceholderConfigurer, Anda dapat mengakses nilai-

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

Menggunakan PropertySource

Dalam versi semi terbaru Anda tidak perlu mendaftar PropertyPlaceHolderConfigurerdengan @PropertySource, saya menemukan yang baik link yang memahami versi compatibility-

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

Menggunakan ResourceBundleMessageSource

Daftar kacang

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

Nilai Akses-

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

atau

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

Menggunakan PropertiesFactoryBean

Daftar kacang

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

Contoh Wire Properties ke dalam class- Anda

@Component
public class BeanTester {
    @Autowired Properties properties; 
    public void execute() {
        String attr = properties.getProperty("ds.type");
    }
}
Komunitas
sumber
Untuk menggunakan PropertySourcesPlaceholderConfigurer, Anda biasanya harus menetapkan lokasi atau sumber daya jika tidak, Anda tidak dapat mengakses file properti. Anda dapat menggunakan mis. ClassPathResource generalProperties = new ClassPathResource ("general.properties");
M46
43

Di kelas konfigurasi

@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;
   }
}
mokshino
sumber
Dalam contoh ini, apakah Anda hanya akan menggunakan yang berbeda app.propertiesdalam pengujian produksi v.? Dengan kata lain, apakah bagian dari proses penyebaran Anda akan diganti app.propertiesdengan nilai-nilai produksi?
Kevin Meredith
1
@KevinMeredith ya, Anda bisa, hanya membagi konfigurasi pegas Anda dengan Profile annotation stackoverflow.com/questions/12691812/…
mokshino
@KevinMeredith kami menggunakan folder di luar penyebaran perang: seperti c: \ apps \ sys_name \ conf \ app.properties. Proses penyebaran menjadi lebih sederhana dan lebih rentan kesalahan.
jpfreire
27

Berikut adalah jawaban tambahan yang juga sangat membantu saya untuk memahami cara kerjanya: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

kacang BeanFactoryPostProcessor harus dinyatakan dengan statis , pengubah

@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();
 }
}
Michael Técourt
sumber
Tidak perlu mendaftar PropertySourcesPlaceholderConfigurerBean secara eksplisit dengan@PropertySource
@ dubey-theHarcourtians versi Spring (core) apa yang Anda gunakan? jika Anda menggunakan Spring Boot, Anda bahkan tidak perlu @PropertySourcesama sekali.
Michael Técourt
11

Jika Anda perlu membaca file properti secara manual tanpa menggunakan @Nilai.

Terima kasih atas halaman yang ditulis dengan baik oleh Lokesh Gupta: Blog

masukkan deskripsi gambar di sini

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;
    }
}
John
sumber
Terima kasih, ini berfungsi untuk kasus saya. Saya perlu membaca properti dari fungsi statis.
Trieu Nguyen
6

Anda perlu meletakkan kacang PropertyPlaceholderConfigurer dalam konteks aplikasi Anda dan mengatur properti lokasinya.

Lihat detailnya di sini: http://www.zparacha.com/how-to-read-properties-file-in-spring/

Anda mungkin harus sedikit memodifikasi file properti Anda agar benda ini berfungsi.

Semoga ini bisa membantu.

instanceOfObject
sumber
4

Cara lain adalah menggunakan ResourceBundle . Pada dasarnya Anda mendapatkan bundel menggunakan namanya tanpa '.properties'

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

Dan Anda memulihkan nilai apa pun menggunakan ini:

private final String prop = resource.getString("propName");
Miluna
sumber
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>
Sangram Badi
sumber
tambahkan beberapa penjelasan
HaveNoDisplayName
menggunakan wadah inti Anda tidak dapat mengakses file properti sumber daya luar, jadi Anda perlu menggunakan wadah j2ee seperti ApplicationContext, dan Anda perlu menggunakan validasi tingkat kacang seperti xmlns, xmlns: util, xsi: schemaLocation, xmlns: xsi
Sangram Badi
0

Saya menginginkan kelas utilitas yang tidak dikelola oleh pegas, jadi tidak ada anotasi pegas seperti @Component, @Configurationdll. Tapi saya ingin kelas membaca dariapplication.properties

Saya berhasil membuatnya bekerja dengan membuat kelas menyadari Konteks Musim Semi, karenanya sadar Environment, dan karenanyaenvironment.getProperty() berfungsi seperti yang diharapkan.

Secara eksplisit, saya punya:

properti aplikasi

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.java (lihat Spring dapatkan ApplicationContext saat ini )

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);
    }
}
Sida Zhou
sumber