好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot中获取profile的方法详解

spring boot与profile

spring boot 的项目中不再使用xml的方式进行配置,并且,它还遵循着约定大于配置。

静态获取方式

静态工具类获取当前项目的profile环境。

?

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

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.stereotype.Component;

 

import java.util.Locale;

 

/**

  *

 

  */

/**

  * @author wangjiuzhou (835540436@qq测试数据)

  * @date 2018/10/27

  * 项目名称:

  * 类名: SpringContextUtil

  * 描述: 获取bean的工具类,可用于在线程里面获取bean

  */

@Component

public class SpringContextUtil implements ApplicationContextAware {

 

     public static final String LOCAL_PROFILE = "local" ;

     public static final String DEV_PROFILE = "dev" ;

     public static final String TEST_PROFILE = "test" ;

     public static final String PRO_PROFILE = "pro" ;

 

 

     private static ApplicationContext context = null ;

 

 

     /* (non Javadoc)

      * @Title: setApplicationContext

      * @Description: spring获取bean工具类

      * @param applicationContext

      * @throws BeansException

      * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)

      */

     @Override

     public void setApplicationContext(ApplicationContext applicationContext)

             throws BeansException {

         context = applicationContext;

     }

 

     // 传入线程中

     public static <T> T getBean(String beanName) {

         return (T) context.getBean(beanName);

     }

 

     // 国际化使用

     public static String getMessage(String key) {

         return context.getMessage(key, null , Locale.getDefault());

     }

 

     // 获取当前环境

     public static String getActiveProfile() {

         return context.getEnvironment().getActiveProfiles()[ 0 ];

     }

}

点评:

这种方式在使用起来很方便也是现在各个博客文章所撰写的方式,在很多Service的业务代码中使用起来很方便,毕竟是静态的方式嘛!

但是有一种缺陷,因为实现ApplicationContextAware接口,而spring中的这个接口是在所有的Bean注入完毕,才会执行setApplicationContext方法,那么问题来了,往往在项目中我们可能会对一些Bean进行一些config操作,例如:@Bean注入,而有时候我们会根据不同的profile进行不同的定制化config。这个时候恰恰我们的工具类SpringContextUtil还没有执行setApplicationContext此时工具类中的context对象还是null。就会出现异常的情况。下面的方式可以弥补这个缺陷。

autowire ProfileConfig

使用这种方式首先声明一下,其实就相当于一个特殊的configBean一样,因为只有这样,这个类才不会在所有bean全部加载完毕后才能获取到context。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.Configuration;

 

/**

  * @author wangjiuzhou (835540436@qq测试数据)

  * @date 2018/11/07

  *

  * 获取当前项目环境:local、dev、test、pro

  */

@Configuration

public class ProfileConfig {

     public static final String LOCAL_PROFILE = "local" ;

     public static final String DEV_PROFILE = "dev" ;

     public static final String TEST_PROFILE = "test" ;

     public static final String PRO_PROFILE = "pro" ;

 

     @Autowired

     private ApplicationContext context;

 

     public String getActiveProfile() {

         return context.getEnvironment().getActiveProfiles()[ 0 ];

     }

}

点评:

ProfileConfig ,首先是作为一个相当于Bean的形式存在着,此处的不在解释@configuration和@component的区别;

注入ApplicationContext因为该接口extends于EnvironmentCapable,所以可以获取到环境的一些信息;

以上就是SpringBoot中获取profile的方法详解的详细内容,更多关于SpringBoot获取profile的资料请关注其它相关文章!

原文链接:https://blog.csdn.net/m0_54850467/article/details/124031603

查看更多关于SpringBoot中获取profile的方法详解的详细内容...

  阅读:28次