Spring JavaConfig for java.util.Properties field

后端 未结 6 2063
面向向阳花
面向向阳花 2021-02-13 02:07


Can you please tell me how to use Spring Javaconfig to directly load/autowire a properties file to a java.util.Properties field?

Thanks!

Later edit - st

相关标签:
6条回答
  • 2021-02-13 02:32

    There is also this approach for injecting properties directly using xml configurations. The context xml has this

    <util:properties id="myProps" location="classpath:META-INF/spring/conf/myProps.properties"/>
    

    and the java class just uses

    @javax.annotation.Resource
    private Properties myProps;
    

    Voila!! it loads. Spring uses the 'id' attribute in xml to bind to the name of variable in your code.

    0 讨论(0)
  • 2021-02-13 02:36

    The XML base Way:

    in spring config:

    <util:properties id="myProperties" location="classpath:com/foo/my-production.properties"/>
    

    in your class:

    @Autowired
    @Qualifier("myProperties")
    private Properties myProperties;
    

    JavaConfig Only

    It looks like there is an annotation:

    @PropertySource("classpath:com/foo/my-production.properties")
    

    Annotating a class with this will load the properties from the file in to the Environment. You then have to autowire the Environment into the class to get the properties.

    @Configuration
    @PropertySource("classpath:com/foo/my-production.properties")
    public class AppConfig {
    
    @Autowired
    private Environment env;
    
    public void someMethod() {
        String prop = env.getProperty("my.prop.name");
        ...
    }
    

    I do not see a way to directly inject them into the Java.util.properties. But you could create a class that uses this annotation that acts as a wrapper, and builds the properties that way.

    0 讨论(0)
  • 2021-02-13 02:42

    It is an old subject but there are also a more basic solution.

    @Configuration
    public class MyConfig {
        @Bean
        public Properties myPropertyBean() {
            Properties properties = new Properties();
            properties.load(...);
            return properties;
        }
    }
    
    0 讨论(0)
  • 2021-02-13 02:43

    You can try this

    @Configuration  
    public class PropertyConfig { 
    
     @Bean("mailProperties")  
     @ConfigurationProperties(prefix = "mail")   
      public Properties getProperties() {
         return new Properties();  
      }
    
    }
    

    Make sure to define properties in application.properties

    0 讨论(0)
  • 2021-02-13 02:46

    declare a PropertiesFactoryBean.

    @Bean
    public PropertiesFactoryBean mailProperties() {
        PropertiesFactoryBean bean = new PropertiesFactoryBean();
        bean.setLocation(new ClassPathResource("mail.properties"));
        return bean;
    }
    

    Legacy code had following config

    <bean id="mailConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
      <property name="location" value="classpath:mail.properties"/>
    </bean>
    

    Converting that to Java config is super easy as shown above.

    0 讨论(0)
  • 2021-02-13 02:49

    application.yml:

    root-something:
        my-properties:
            key1: val1
            key2: val2
    

    Your type-safe pojo:

    import java.util.Properties;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "root-something")
    public class RootSomethingPojo {
    
        private Properties myProperties;
    

    Your container configuration:

    @Configuration
    @EnableConfigurationProperties({ RootSomethingPojo .class })
    public class MySpringConfiguration {
    

    This will inject the key-value pairs directly into the myProperties field.

    0 讨论(0)
提交回复
热议问题