• 【译】Spring 4 @PropertySource和@Value注解示例


    前言

    译文链接:http://websystique.com/spring/spring-propertysource-value-annotations-example/

    本篇文章将展示如何通过@PropertySource@Value注解从配置文件中读取属性值。

    同样,我们也会讨论Spring的Environment接口,还会看到使用XML配置和使用注解的对比。

    Spring的@PropertySource注解主要是让Spring的Environment接口读取属性配置文件用的,这个注解是标识在@Configuration配置类上的。

    Spring的@Value注解可以用在字段和方法上。通常用于从属性配置文件中读取属性值,也可以设置默认值。接下来就让我么看下完整的例子吧。

    涉及的技术及开发工具

    • Spring 4.0.6.RELEASE
    • Maven 3
    • JDK 1.6
    • Eclipse JUNO Service Release 2

    工程结构目录

    步骤一:往pom.xml中添加依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
     
        <groupId>com.websystique.spring</groupId>
        <artifactId>Spring4PropertySourceExample</artifactId>
        <version>1.0.0</version>
        <packaging>jar</packaging>
     
        <name>Spring4PropertySourceExample</name>
     
        <properties>
            <springframework.version>4.0.6.RELEASE</springframework.version>
        </properties>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${springframework.version}</version>
            </dependency>
        </dependencies>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.2</version>
                        <configuration>
                            <source>1.6</source>
                            <target>1.6</target>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
     
    </project>

    步骤二:创建Spring配置类

    Spring配置类是指用@Configuration注解标注的类,这些类包含了用@Bean标注的方法。这些被@Bean标注的方法可以生产bean并交由spring容器管理。

    package com.websystique.spring.configuration;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
     
    @Configuration
    @ComponentScan(basePackages = "com.websystique.spring")
    @PropertySource(value = { "classpath:application.properties" })
    public class AppConfig {
     
        /*
         * PropertySourcesPlaceHolderConfigurer Bean only required for @Value("{}") annotations.
         * Remove this bean if you are not using @Value annotations for injecting properties.
         */
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
            return new PropertySourcesPlaceholderConfigurer();
        }
    }

    @PropertySource(value = { “classpath:application.properties” })注解可以让在application.properties文件中定义的属性对Spring Envirronment bean可用,Environment接口提供了getter方法读取单独的属性值。

    注意PropertySourcesPlaceholderConfigurer这个bean,这个bean主要用于解决@value中使用的${…}占位符。假如你不使用${…}占位符的话,可以不使用这个bean。

    以上的配置使用XML替代的话,如下:

    app-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-4.0.xsd">
     
        <context:component-scan base-package="com.websystique.spring"/>
     
        <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
            <property name="ignoreUnresolvablePlaceholders" value="true"/>
            <property name="locations">
              <list>
                <value>classpath:application.properties</value>
              </list>
            </property>
          </bean>
    </beans>

    步骤三:创建配置文件

    jdbc.driverClassName = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/websystique
    jdbc.username = myuser
    jdbc.password = mypassword
    hibernate.dialect = org.hibernate.dialect.MySQLDialect
    hibernate.show_sql = false
    hibernate.format_sql = false
    sourceLocation = /dev/input

    我们将会在service类里使用上面提到的配置方式读取这个配置文件

    步骤四:创建服务类

    package com.websystique.spring.service;
     
    public interface FileService {
     
        void readValues();
    }
    package com.websystique.spring.service;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.core.env.Environment;
    import org.springframework.stereotype.Service;
     
    @Service("fileService")
    public class FileServiceImpl implements FileService {
     
        @Value("${sourceLocation:c:/temp/input}")
        private String source;
     
        @Value("${destinationLocation:c:/temp/output}")
        private String destination;
     
        @Autowired
        private Environment environment;
     
        public void readValues() {
            System.out.println("Getting property via Spring Environment :"
                    + environment.getProperty("jdbc.driverClassName"));
     
            System.out.println("Source Location : " + source);
            System.out.println("Destination Location : " + destination);
             
        }
     
    }

    这里首先要注意的是Environment bean被Spring自动注入。另外,由于配置了@PropertySoruce注解,Environment bean可以访问指定配置文件里定义的所有属性值。你可以使用getProperty方法得到指定值。

    另外一点值得注意的是@Value注解,基本格式如下:

    @value("${key:default")
    private String var;

    以上声明指导spring根据key去属性配置文件查找value,如果没找到,则使用default作为默认值。

    注意以上的${…}占位符只有当注册了PropertySourcesPlaceholderConfigurer bean后才能被解析,否则@Value注解会一直将默认值赋值给var。

    步骤五:创建Main方法运行程序

    package com.websystique.spring;
     
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.AbstractApplicationContext;
     
    import com.websystique.spring.configuration.AppConfig;
    import com.websystique.spring.service.FileService;
     
    public class AppMain {
         
        public static void main(String args[]){
            AbstractApplicationContext  context = new AnnotationConfigApplicationContext(AppConfig.class);
            FileService service = (FileService) context.getBean("fileService");
             
            service.readValues();
            context.close();
        }
         
    }

    运行以上程序,得到如下结果:

    Getting property via Spring Environment :com.mysql.jdbc.Driver
    Source Location : /dev/input
    Destination Location : c:/temp/output
    由于destinationLocation属性在application.properties文件中没定义,所以使用默认值。
    最后,若使用XML配置,请将
    AbstractApplicationContext  context = new AnnotationConfigApplicationContext(AppConfig.class);
    替换为
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
    即可,
    会得到相同的输出结果。

    工程源码

    http://websystique.com/?smd_process_download=1&download_id=796

  • 相关阅读:
    ($children,$refs,$parent)的使用
    watch监听变化
    vue组件间通信六种方式(完整版)
    CSS水平垂直居中常见方法总结2
    CSS水平垂直居中常见方法总结
    Uncaught SyntaxError: Unexpected identifier 报错 import Vue from 'vue';
    前端跳槽面试必备
    防止重复发送Ajax请求问题
    JQuery中的$().each 以及 $.each的区别
    数组中的forEach和map的区别
  • 原文地址:https://www.cnblogs.com/chenpi/p/6212534.html
Copyright © 2020-2023  润新知