Spring Boot 之属性配置 Aware,Environment,Profile源码(八)

Spring Boot 属性配置的方式有以下几种,优先级分别从高到底排列

1、Devtool全局配置

2、测试环境@TestPropertySouce注解

3、测试环境properties属性

4、命令行参数

5、SPRING_APPLICATION_JSON属性

6、ServletConfig初始化参数

7、ServletContext初始化参数

8、JNDI属性

9、JAVA系统属性

10、操作系统环境变量

11、RandomValuePropertySource随机值属性

12、jar包外的application-{profile}.properties

13、jar包内的application-{profile}.properties

14、jar包外的application.properties

15、jar包内的application.properties

16、@PropertySource绑定配置

17、默认属性

 

 下面分别从低优先级开始

17、默认属性

1)增加属性weburl的值为www.baidu.com

@SpringBootApplication

@MapperScan("com.example.demo.mapper")

public class Sb2Application {


    public static void main(String[] args) {

        SpringApplication springApplication = new SpringApplication(Sb2Application.class);

        Properties properties = new Properties();

        properties.setProperty("weburl","www.baidu.com");

        springApplication.setDefaultProperties(properties);

        springApplication.run(args);

    }


}

  

2)然后通过一个启动类加载器打印属性weburl

@Component

public class ResultCommandLineRunner implements CommandLineRunner, EnvironmentAware {


    private Environment env;


    @Override

    public void run(String... args) throws Exception {

        System.out.println(env.getProperty("weburl"));

    }




    @Override

    public void setEnvironment(Environment environment) {

        this.env = environment;

    }

}

  

3)输出结果

 .   ____          _            __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::        (v2.1.6.RELEASE)


...


www.baidu.com

  

16、@PropertySource绑定配置

1)在前面的基础上,在resources文件夹下增加demo.properties文件

 

2) 然后使用PropertySource绑定配置

 

3) 运行程序

 

14、jar包外的application.properties

创建application.yml

 

 输出结果

 

然后在application.properties增加配置

 

输出结果为

说明application.properties的优先级高于application.yml

 

13、jar包内的application-{profile}.properties

增加application-default.yml

输出结果

增加application-default.properties

输出结果

 

11、RandomValuePropertySource随机值属性

1)在application-default.properties中增加一个属性,值为随机数

2)在启动类加载器中输出这个属性

3) 运行结果

 

 

10、操作系统环境变量

设置环境变量

输出结果

9、JAVA系统属性

增加获取虚拟机名字

 

在启动类加载器中输出这个属性

 输出结果

6、ServletConfig初始化参数  7、ServletContext初始化参数

6、7两种主要是通过server.xxx设置一些属性

5、SPRING_APPLICATION_JSON属性

增加参数--SPRING_APPLICATION_JSON={\"weburl\":\"hello,SPRING_APPLICATION_JSON\"}

输出结果:

4、命令行参数

增加参数

输出结果

2、测试环境@TestPropertySouce注解  3、测试环境properties属性

这两个测试用的比较多

 

Spring Aware原理

一、Aware介绍

Spring框架有点: Bean感知不到容器的存在

使用场景: 需要使用Spirng容器的功能资源

引入缺点: Bean和容器强耦合

 

二、常用Aware

类名作用
BeanNameAware获取容器中bean名称
BeanClassLoaderAware获得类加载器
BeanFactoryAware获得bean创建工厂
EnviromentAware获得环境变量
EnvironmentValueResolverAware获取spring容器加载的properties文件属性值
ResourceLoaderAware获得资源加载器
ApplicationEventPublisherAware  获得应用程序发布器
MessageSourceAware获得文本信息
ApplicationContextAware  

获得当前应用上下文

 


 

 

 

 

 

 

 

 

三、Aware调用原理
我们以ResultCommandLineRunner启动类加载器为例。实现了EnvironmentAware接口,目的就是为了获得environment,从而打印属性

@Component

public class ResultCommandLineRunner implements CommandLineRunner, EnvironmentAware , MyAware{


    private Environment env;


    private  Flag flag;


    @Override

    public void run(String... args) throws Exception {

        System.out.println(flag.isCanOperate());

        System.out.println(env.getProperty("weburl"));

        System.out.println(env.getProperty("weburl.random"));

        System.out.println(env.getProperty("weburl.vm.name"));

    }


    @Override

    public void setEnvironment(Environment environment) {

        this.env = environment;

    }


    @Override

    public void setFlag(Flag flag) {

        this.flag = flag;

    }

}

1、Debug运行程序,定位到initializeBean方法

2、进入initializeBean。beanName为resultCommandLineRunner(可以根据beanName设置条件断点)

下面是initializeBean的方法

 

 

3、进入postProcessBeforeInitialization方法

 

 

 

4、进入ApplicationContextAwareProcessor类的invokeAwareInterfaces方法

 

 

5、然后就进入了setEnvironment方法,参数为environment。

 

 这就是通过启动类加载器,实现EnvironmentAware,从而获得Environment的流程

 

 四、模拟创建自定义Aware

1、创建Flag类

1

2

3

4

5

6

7

8

9

10

11

12

13

@Component

public class Flag

{

    private boolean canOperate = true;

 

    public boolean isCanOperate() {

        return canOperate;

    }

 

    public void setCanOperate(boolean canOperate) {

        this.canOperate = canOperate;

    }

}

  

2、创建自定义Aware接口,目的就是为了获得Flag。继承Aware接口

1

2

3

4

public interface MyAware extends Aware{

 

    void setFlag(Flag flag);

}

  

3、创建处理器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@Component

public class MyAwareProcess implements BeanPostProcessor{

 

    private final ConfigurableApplicationContext configurableApplicationContext;

 

    public MyAwareProcess( ConfigurableApplicationContext configurableApplicationContext){

        this.configurableApplicationContext = configurableApplicationContext;

    }

 

    @Nullable

    @Override

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        if(bean instanceof Aware){

            if(bean instanceof  MyAware){

                ((MyAware)bean).setFlag((Flag) configurableApplicationContext.getBean("flag"));

            }

        }

        return bean;

    }

}

  

4、启动类加载器增加flag变量

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

@Component

public class ResultCommandLineRunner implements CommandLineRunner, EnvironmentAware , MyAware{

 

    private Environment env;

 

    private  Flag flag;

 

    @Override

    public void run(String... args) throws Exception {

        System.out.println(flag.isCanOperate());

        System.out.println(env.getProperty("weburl"));

        System.out.println(env.getProperty("weburl.random"));

        System.out.println(env.getProperty("weburl.vm.name"));

    }

 

    @Override

    public void setEnvironment(Environment environment) {

        this.env = environment;

    }

 

    @Override

    public void setFlag(Flag flag) {

        this.flag = flag;

    }

}

  

5、运行。输出flag为true

 

Spring Aware原理

https://www.cnblogs.com/linlf03/p/12384829.html

 

SpringBoot Environment使用

https://www.cnblogs.com/linlf03/p/12386371.html

 

SpringBoot Profile源码介绍

https://www.cnblogs.com/linlf03/p/12389396.html

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值