বৈশিষ্ট্য ফাইল থেকে মানগুলি কীভাবে পড়বেন?


133

আমি বসন্ত ব্যবহার করছি। আমি বৈশিষ্ট্য ফাইল থেকে মান পড়তে হবে। এটি অভ্যন্তরীণ বৈশিষ্ট্য ফাইল যা বাহ্যিক বৈশিষ্ট্য ফাইল নয়। প্রোপার্টি ফাইলটি নীচের মতো হতে পারে।

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

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

Thoseতিহ্যগত উপায়ে নয় এমন বৈশিষ্ট্য ফাইল থেকে আমার সেই মানগুলি পড়তে হবে। কীভাবে এটি অর্জন করবেন? বসন্ত 3.0 এর সাথে কোনও সাম্প্রতিক পদ্ধতির কি নেই?


7
এটি কোনও বৈশিষ্ট্য ফাইলের মতো দেখাচ্ছে না ।
রঘুরাম

এটি যদি জাভা অর্থে কোনও সম্পত্তি ফাইল হয় - হ্যাঁ। অন্যথায় এটি একটি কাস্টম ফাইল ফর্ম্যাট যা পৃথকভাবে চিকিত্সা করা প্রয়োজন (এবং যদি আপনি কীগুলি না পান তবে আপনি স্প্রিংয়ে সম্পত্তি মান হিসাবে লাইনগুলি ব্যবহার করতে পারবেন না)।
হউকে ইঙ্গমার শ্মিড্ট

3
"প্রচলিত পদ্ধতিতে নয়" - এর অর্থ কী?
হউকে ইঙ্গমার শ্মিত

মানে টীকাগুলি ব্যবহার করা
.. xML

উত্তর:


196

আপনার প্রসঙ্গে সম্পত্তি প্লেসোল্ডার কনফিগার করুন:

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

তারপরে আপনি আপনার শিমের বৈশিষ্ট্যগুলি উল্লেখ করুন:

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

সম্পাদনা: বহিরাগত কমা-বিভাজিত মানগুলির সাথে সম্পত্তি পার্স করার জন্য কোডটি আপডেট করেছে:

my.property.name=aaa,bbb,ccc

যদি এটি কাজ করে না, আপনি বৈশিষ্ট্য সহ একটি মটরশুটি সংজ্ঞায়িত করতে পারেন, ইঞ্জেকশন করতে পারেন এবং ম্যানুয়ালি এটি প্রক্রিয়া করতে পারেন:

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

হাই ম্রেম্বিস, আপনার উত্তরের জন্য ধন্যবাদ আমি ইতিমধ্যে বহিরাগত বৈশিষ্ট্য ফাইল থেকে মানগুলি পড়তে প্রম্পট-প্লেসোল্ডারকে কনফিগার করেছি। তবে আমার রিসোর্স ফোল্ডারের ভিতরে একটি বৈশিষ্ট্যযুক্ত ফাইল রয়েছে। আমার পড়া এবং ইনজেকশন করা দরকার। আমার সমস্ত মান তালিকাতে ইনজেক্ট করতে হবে। ধন্যবাদ!
ব্যবহারকারী 1016403

@ ইথান দ্বারা প্রস্তাবিত হিসাবে সম্পাদিত। আপডেটের জন্য ধন্যবাদ, মূল সম্পাদনাটি গ্রহণ করতে পারেনি, ইতিমধ্যে অনেক দেরি হয়ে গেছে।
mrembisz

2
: যদি যেখানে আপনি কমা সাথে ডিল করা হয় পৃথক মান সম্ভবত বিবেচনা কি এল ব্যবহার করে এখানে প্রস্তাবিত হচ্ছে জন্য stackoverflow.com/questions/12576156/...
arcseldon

2
আমরা কীভাবে ব্যবহার করব aaa? @Value(${aaa}) private String aaa;তাহলে কি আমরা পারব System.out.println(aaa)???????

2
@ ব্যবহারকারী 75782131 আরও স্পষ্টভাবে @Value("${aaa}"), উদ্ধৃতি মনে রাখবেন। এবং হ্যাঁ, আপনি এটি কন্সট্রাক্টর ছাড়াই প্রিন্ট করতে পারেন কারণ মানগুলি ইনজেকশনের আগে কনস্ট্রাক্টর কার্যকর করা হয়।
mrembisz

48

এটি অর্জনের বিভিন্ন উপায় রয়েছে। নীচে বসন্তের কয়েকটি সাধারণভাবে ব্যবহৃত উপায়-

  1. প্রপার্টিপ্লেসহোল্ডার কনফিগারার ব্যবহার করে

  2. সম্পত্তি সম্পদ ব্যবহার করে

  3. রিসোর্সবাণ্ডলমেসেজসোর্স ব্যবহার করে

  4. প্রোপার্টিফ্যাক্টরিবিয়ান ব্যবহার করা

    এবং আরো অনেক........................

ধরে ds.typeনেওয়া আপনার সম্পত্তি ফাইলের কী।


ব্যবহার PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurerশিম রেজিস্টার -

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

আপনার শ্রেণিতে ওয়্যার বৈশিষ্ট্য উদাহরণ

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

প্রোপার্টিসোর্সপ্লেসহোল্ডার কনফিগারার ব্যবহার করতে আপনাকে সাধারণত একটি অবস্থান বা সংস্থান সেট করতে হবে অন্যথায় আপনি কোনও সম্পত্তি ফাইলটিতে অ্যাক্সেস করতে পারবেন না। আপনি উদাহরণস্বরূপ ClassPathResource generalProperties = নতুন ClassPathResource ("general.properties") ব্যবহার করতে পারেন;
এম 46

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

@ কেভিনমারেডে আমরা যুদ্ধের বাইরে একটি ফোল্ডার ব্যবহার করি: সি: \ অ্যাপস \ সিস_নাম \ কনফ। অ্যাপ.প্রোপার্টি like স্থাপন প্রক্রিয়া সরলীকৃত হয় এবং ত্রুটি-প্রবণতাও কম হয়ে যায়।
jpfreire

27

এটি একটি অতিরিক্ত উত্তর যা এটি কীভাবে কাজ করেছে তা বুঝতে আমার পক্ষে দুর্দান্ত সহায়তা ছিল: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html

যে কোনও বিয়ানফ্যাক্ট্রিপোস্টপ্রসেসর শিমকে স্ট্যাটিক , মডিফায়ার দিয়ে ঘোষণা করতে হয়

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

স্পষ্টভাবে রেজিস্টার করার কোন প্রয়োজন নেই PropertySourcesPlaceholderConfigurerসঙ্গে সিম@PropertySource

@ দুবে-দ্য হারকোরিটিয়ানরা আপনি কোন বসন্ত (মূল) সংস্করণ ব্যবহার করেন? যদি আপনি স্প্রিং বুট ব্যবহার করেন তবে আপনার এমনকি @PropertySourceপুরোপুরি প্রয়োজন নেই ।
মাইকেল ট্যাকোর্ট

11

আপনার যদি প্রয়োজন হয় ম্যানুয়ালি @ ভ্যালু ব্যবহার না করে কোনও সম্পত্তি ফাইল পড়তে।

লোকেশ গুপ্তের লিখিত পৃষ্ঠার জন্য ধন্যবাদ: ব্লগ

এখানে চিত্র বর্ণনা লিখুন

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

ধন্যবাদ, এটি আমার ক্ষেত্রে কাজ করে। আমার স্ট্যাটিক ফাংশন থেকে বৈশিষ্ট্যগুলি পড়তে হবে।
ট্রিইউ এনগুইন

6

আপনার অ্যাপ্লিকেশন প্রসঙ্গে আপনাকে প্রপার্টিপ্লেসহোল্ডার কনফিগুরে সিম লাগাতে হবে এবং এর অবস্থানের সম্পত্তিটি সেট করতে হবে।

বিশদটি এখানে দেখুন: http://www.zparacha.com/how-to-read-properties-file-in-spring/

এই জিনিসটি কাজ করার জন্য আপনাকে নিজের সম্পত্তি ফাইলটি কিছুটা পরিবর্তন করতে হতে পারে।

আশা করি এটা সাহায্য করবে.


4

আরেকটি উপায় হ'ল রিসোর্সবাণ্ডল ব্যবহার করা । মূলত আপনি '.poperties' ছাড়াই এর নাম ব্যবহার করে বান্ডিল পান

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

মূল ধারক ব্যবহার করে আপনি বাইরের রিসোর্স প্রোপার্টি ফাইলটি অ্যাক্সেস করতে পারবেন না, তাই আপনার অ্যাপ্লিকেশন কনটেক্সট এর মতো জে 2 আই পাত্রে ব্যবহার করা দরকার এবং আপনার মটরশুটি স্তরের বৈধতা xMLns, xmlns: ব্যবহার, এক্সসি: স্কিমা লোকেশন, এক্সএমএনএলএস: এক্সসি
সংগ্রাম বড় ২

0

আমি বাইরের কনফিগারেশন ইনজেকশন সম্পর্কে স্প্রিংবুট ডক্স থেকে এই লিঙ্কটি https://docs.spring.io/spring-boot/docs/c टका/references/html/boot-features-ternternal-config.html পড়ার পরামর্শ দেব । তারা কেবল কোনও সম্পত্তি ফাইল থেকে পুনরুদ্ধার সম্পর্কে কথা বলেনি, তবে ওয়াইএএমএল এবং এমনকি জেএসওএন ফাইলও নিয়েছেন। আমি এটি সহায়ক বলে মনে করি। আমি আশা করি তুমিও করবে.


0

আমি একটি ইউটিলিটি ক্লাস চেয়েছিলাম যা বসন্ত দ্বারা পরিচালিত হয় না, সুতরাং বসন্তের টীকাগুলি ইত্যাদির মতো নয় @Component, @Configurationতবে আমি ক্লাসটি পড়তে চেয়েছিলামapplication.properties

আমি ক্লাসটি বসন্ত প্রসঙ্গে সচেতন হওয়ার মাধ্যমে এটি কাজ করার ব্যবস্থা করেছিলাম, তাই সচেতন 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")) 
    }
}

অ্যাপ্লিকেশন কনটেক্সটপ্রভাইডার.জভা ( স্প্রিংয়ের বর্তমান অ্যাপ্লিকেশন কনটেক্সট দেখুন )

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.