spring boot environmentaware接口实现环境变量读取和属性对象的绑定

其实获取系统变量有一种非常简单的方法,直接一行代码搞定,代码为:

1
System.getenv().get( "JAVA_HOME" )

咱们这里介绍凡是被spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package  com.kfit.environment;
  
import  org.springframework.beans.factory.annotation.Value;
import  org.springframework.boot.bind.RelaxedPropertyResolver;
import  org.springframework.context.EnvironmentAware;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.core.env.Environment;
  
/**
  * 主要是@Configuration,实现接口:EnvironmentAware就能获取到系统环境信息;
  *
 
  */
@Configuration
public  class  MyEnvironmentAware  implements  EnvironmentAware{
  
        //注入application.properties的属性到指定变量中.
        @Value ( "${spring.datasource.url}" )
        private  String myUrl;
       
        /**
         *注意重写的方法 setEnvironment 是在系统启动的时候被执行。
         */
        @Override
        public  void  setEnvironment(Environment environment) {
              
               //打印注入的属性信息.
               System.out.println( "myUrl=" +myUrl);
              
               //通过 environment 获取到系统属性.
               System.out.println(environment.getProperty( "JAVA_HOME" ));
              
               //通过 environment 同样能获取到application.properties配置的属性.
               System.out.println(environment.getProperty( "spring.datasource.url" ));
              
               //获取到前缀是"spring.datasource." 的属性列表值.
               RelaxedPropertyResolver relaxedPropertyResolver =  new  RelaxedPropertyResolver(environment,  "spring.datasource." );
               System.out.println( "spring.datasource.url=" +relaxedPropertyResolver.getProperty( "url" ));
        System.out.println( "spring.datasource.driverClassName=" +relaxedPropertyResolver.getProperty( "driverClassName" ));
        }
}

其中application.properties文件信息是:

1
2
3
4
5
6
7
8
9
10
11
########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql: //localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active= 20
spring.datasource.max-idle= 8
spring.datasource.min-idle= 8
spring.datasource.initial-size= 10

@Controller @Service 等被Spring管理的类都支持,注意重写的方法 setEnvironment 是在系统启动的时候被执行。 

或者如下Controller:

1
2
3
4
5
6
7
8
9
@Controller
publicclassPageControllerimplementsEnvironmentAware{
  
     @Override
     publicvoid setEnvironment(Environment environment) {
         String s = environment.getProperty( "JAVA_HOME" );
         System.out.println(s);
     }
}

我们还可以通过@ConfigurationProperties 读取application属性配置文件中的属性。

1
2
3
4
5
6
7
8
9
Configuration
@ConditionalOnClass (Mongo. class )
@EnableConfigurationProperties (MongoProperties. class )
publicclassMongoAutoConfiguration {
  
     @Autowired
     private  MongoProperties properties;
  
}

·         @ConditionOnClass表明该@Configuration仅仅在一定条件下才会被加载,这里的条件是Mongo.class位于类路径上

·         @EnableConfigurationProperties将Spring Boot的配置文件(application.properties)中的spring.data.mongodb.*属性映射为MongoProperties并注入到MongoAutoConfiguration中。

·         @ConditionalOnMissingBean说明Spring Boot仅仅在当前上下文中不存在Mongo对象时,才会实例化一个Bean。这个逻辑也体现了Spring Boot的另外一个特性——自定义的Bean优先于框架的默认配置,我们如果显式的在业务代码中定义了一个Mongo对象,那么Spring Boot就不再创建。

1
2
3
4
5
6
7
8
9
10
@ConfigurationProperties (prefix =  "spring.data.mongodb" )
publicclass MongoProperties {
  
     private  String host;
     privateint port = DBPort.PORT;
     private  String uri =  "mongodb://localhost/test" ;
     private  String database;
  
     // ... getters/ setters omitted
}

它就是以spring.data.mongodb作为前缀的属性,然后通过名字直接映射为对象的属性,同时还包含了一些默认值。如果不配置,那么mongo.uri就是mongodb://localhost/test。

以上这个配置需要加入依赖:

1
2
3
4
5
6
        < dependency >
            < groupId >org.springframework.boot groupId >
            < artifactId >spring-boot-configuration-processor artifactId >
            < optional >true optional >
        dependency >

你可能感兴趣的:(Spring,Boot)