Spring读取配置文件的方式总结

一、基于XML配置的方式

1.使用 PropertyPlaceholderConfigurer

- 在 applicationContext.xml 中配置:

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

或者:

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

- 之后就可以在代码中访问了:

@Component
public class TestComponent {
    @Value("${jdbc.url}")
    private String url;
}

 

2.使用 PropertiesFactoryBean

- 注册 bean

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

- 使用

private String url;

@Resource(name = "dbProperties")
private Properties properties;

@PostConstruct
public void init() {
    url = properties.getProperty("jdbc.url");
}

 

3.使用 ResourceBundleMessageSource

- 注册 bean

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

- 访问
可以使用如下方法来访问:

((ApplicationContext)context).getMessage("jdbc.url", null, null);

或者:

@Component
public class BeanTester {
    @Autowired
    private MessageSource messageSource;

    public void execute(){
        String url = this.messageSource.getMessage("jdbc.url", null, null);
    }
}

 

二、基于Java配置的方式

1.使用 PropertySource

    1.1通过 Environment 来获取

@Configuration
// 另有 PropertySources 包含多个 @PropertySource 来配置多个配置文件
@PropertySource("classpath:db.properties")
public class PropertySource {
    @Autowired
    Environment env;

    public void execute() {
        // 你可以按照如下的方式获取属性值
        String url = this.env.getProperty("jdbc.url");
    }
}

 

    1.2通过 PropertySourcesPlaceholderConfigurer 来获取

@Configuration
@PropertySource("classpath:db.properties")
public class PropertySource {
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

调用:

@Component
public class TestComponent {
    @Value("${jdbc.url}")
    private String url;
}

 

2.使用 PropertiesFactoryBean

- 注册 bean:

@Bean
public PropertiesFactoryBean propertiesFactoryBean() {
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
    // 可以配置多个配置文件,也可以使用setLocation值设置单个配置文件
    Resource[] resources = new ClassPathResource[]{new ClassPathResource("db.properties")};
    propertiesFactoryBean.setLocations(resources);
    return propertiesFactoryBean;
}

- 使用:

@Component
public class BeanTester {
    private String url;

    @Resource(name = "propertiesFactoryBean")
    private Properties properties;

    @PostConstruct
    public void init() {
        // 取到jdbc.url对应的值并赋给了全局变量url
        url = properties.getProperty("jdbc.url");
    }
}

 

三、SpringBoot

1. application.xml (或.yml) 中有如下配置内容:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test

 

1.1 可以直接通过 @Value 注解获取:

@SpringBootApplication
@RestController
public class Applaction {
    @Value("${spring.datasource.url}")
    private String url;
}

 

1.2可以通过 Environment 来获取:

@SpringBootApplication
@RestController
public class Applaction {
    @Autowired
    private Environment env;

    public void test() {
        // 获取配置文件中的属性
        env.getProperty("spring.datasource.url");
    }
}

 

2.如果是用户自定义的配置文件,我们可以使用 @ConfigurationProperties 注解来获取:

如你在resources/resources下有一个配置文件 author.properties:

author.name=EricChan
author.sex=male

我们可以通过 @ConfigurationProperties 来将 properties 属性和一个 Bean 及其属性关联,从而实现类型安全的配置:

@Getter
@Setter
@ToString @Component @PropertySource(value
= "classpath:resources/author.properties", encoding = "UTF-8") @ConfigurationProperties public class Author { private String name; private String sex; }

之后我们就可以通过将该 Bean 注入到其他需要使用的地方就可以获取了,比如:

@RestController
public class TestController {
    public final Author author;
    
    // 将该 bean 注入进来
    public TestController(final Author author) {
        this.author = author;
    }

    public void test() {
        System.out.println(author);
    }
}

 

还有种通过注册监听器的方式可以来实现,实现 ApplicationListener<ApplicationStartedEvent>,但觉得该方式比较麻烦,不太实用,在这里暂不做介绍,有兴趣的可以自己百度谷歌就行了。

 

posted @ 2018-09-03 13:08  陈先生丶  阅读(1110)  评论(0编辑  收藏  举报