之前开发用过 maven 的环境隔离,现在使用springboot的@Profile功能,发现spring体系真的大到我只是学习了皮毛。相比面试问的 IOC,bean的作用域等,突然觉得很可笑。


官方文档关于 Profile 的使用

https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#boot-features-profiles


    @Profile注解使用范围:

    @Configration 和 @Component 注解的类及其方法,其中包括继承了@Component的注解:@Service、@Controller、@Repository等…


    @Profile可接受一个或者多个参数,例如:


@Service

@Profile({"prod","default"})


Demo


 

先看项目架构体系,只需要看展示的类,其他不用管


在这里插入图片描述

application.properties 配置文件


spring.profiles.active=prod,default


service


public interface ProfileService {

    String getMsg();

}



service.impl


@Service

@Profile("dev")

public class DevServiceImpl implements ProfileService {


    public DevServiceImpl() {

        System.out.println("我是开发环境。。。。。");

    }


    @Override

    public String getMsg() {

        StringBuilder sb = new StringBuilder();

        sb.append("我在开发环境,").append("我只能吃加班餐:大米饭。。。。");

        return sb.toString();

    }

}




@Service

@Profile({"prod","default"})

public class ProdServiceImpl implements ProfileService {


    public ProdServiceImpl() {

        System.out.println("我是生产环境。。。。。");

    }


    @Override

    public String getMsg() {

        StringBuilder sb = new StringBuilder();

        sb.append("我在生产环境,").append("我可以吃鸡鸭鱼牛羊肉。。。。");

        return sb.toString();

    }


}




controller


@Profile("dev")

@RestController

public class DevController {


    @Autowired

    private ProfileService profileService;


    @RequestMapping(value = "/")

    public String dev(){

        return "hello-dev\n"+profileService.getMsg();

    }


}




@Profile("prod")

@RestController

public class ProdController {


    @Autowired

    private ProfileService profileService;


    @RequestMapping(value = "/")

    public String prod(){

        return "hello-prod\n"+profileService.getMsg();

    }


}





在application.properties 配置文件使用不同的环境会执行不同的方法。


那么问题来了,这个功能使如何实现的?如果让你设计你会怎么做?面试新题,啊哈哈哈哈

获取profile值


参考来源:一下找不到了…囧


使用profile帮我解决了不同环境使用不同配置的问题,那么如果我们需要在代码中获取这个profile的值怎么处理呢?


@Component

public class ProfileUtil implements ApplicationContextAware {


    private static ApplicationContext context = null;


    @Override

    public void setApplicationContext(ApplicationContext applicationContext)

            throws BeansException {

        this.context = applicationContext;

    }


    // 获取当前环境参数  exp: dev,prod,test

    public static String getActiveProfile() {

        String []profiles = context.getEnvironment().getActiveProfiles();

        if( ! ArrayUtils.isEmpty(profiles)){

            return profiles[0];

        }

        return "";

    }

}

 ————————————————