第八课springboot通过@Profile注解配合maven打包的应用

编程

第八课:springboot 通过@Profile注解配合maven打包的应用

  • 简介
  • 项目的结构
  • 代码内容
    • 1.pom.xml
    • 2.application.properties
    • 3.IpAddressInInterceptor.java
    • 4.WebMvcConfig.java

  • 实现的原理内容

简介

基于前面的 文章
第六课:springboot实现不同环境配置加载方式一

项目中我们不但会碰到不同的测试环境配置的文件可能不同;有时间配置的一些拦截器或者特殊功能的类也有可能是不同的; 那就需要我们根据不同的环境配置来确定某些对象是否生效;
比如案例中的白名单设置;我希望在线上环境是生效的;但是对应的测试环境没有什么太多作用;还需要根据不同的上游配置很多的白名单信息; 就需要用到@Profile注解;
@Profile 注解可以设置在对象或者对应的@Bean注释的方法上;标识当前spring.profiles.active 中配置的值和@Profile注解中的value值一样的时间才会生效;
项目demo下载

项目的结构

代码内容

1.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.khy.boot</groupId>

<artifactId>boot-profiles</artifactId>

<version>0.0.1-SNAPSHOT</version>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.4.RELEASE</version>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<!--含有多个main 需要指定某一个启动class-->

<start-class>com.khy.MainApplication</start-class>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.6</version>

</dependency>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>3.4</version>

</dependency>

<dependency>

<groupId>commons-collections</groupId>

<artifactId>commons-collections</artifactId>

</dependency>

</dependencies>

<!-- 通过maven的profiles 来替换application.properties文件中的profiles -->

<profiles>

<profile>

<id>dev</id>

<properties>

<profileActive>dev</profileActive>

</properties>

</profile>

<profile>

<id>prod</id>

<properties>

<profileActive>prod</profileActive>

</properties>

<!-- 默认线上的配置是生效的怕设置忘记了 -->

<activation>

<activeByDefault>true</activeByDefault>

</activation>

</profile>

<profile>

<id>test</id>

<properties>

<profileActive>test</profileActive>

</properties>

</profile>

</profiles>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

</project>

2.application.properties

server.port=8080

spring.profiles.active=@profileActive@

3.IpAddressInInterceptor.java

/** * ip白名单拦截器 * @author khy * @createTime 2020年6月15日下午2:27:37 */

publicclassIpAddressInInterceptorextendsHandlerInterceptorAdapter{

// 模拟添加的白名单内容 可以配置到对于的数据库或者缓存文件中

privatefinalstatic List<String>WHITELIST =newArrayList<String>(){{

add("127.0.0.1");

}};

@Override

publicbooleanpreHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)throws Exception {

StringBuffer requestURL = httpServletRequest.getRequestURL();

boolean res=handleMessage(httpServletRequest);

if(res ==false){

httpServletResponse.setCharacterEncoding("UTF-8");

httpServletResponse.setContentType("application/json;charset=utf-8");

String msg =" 未授权的客户端IP: "+getRealIp(httpServletRequest);

JSONObject json =newJSONObject();

json.put("code","10000");

json.put("msg", msg);

httpServletResponse.getWriter().write(json.toString());

}

return res;

}

/** * 验证IP是否授权 * */

privatebooleanhandleMessage(HttpServletRequest request){

// HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);

// 通过一个IpAddressConfig对象,从XML文件中读取预先设置的允许和拒绝的IP地址,这些值也可以来自数据库

String ipAddr =getRealIp(request);// 取客户端IP地址

boolean valid =false;

if(WHITELIST.contains(ipAddr)){//如果配置的集合中含有当前ip白名单则执行

valid =true;

}

if(valid){

returntrue;

}else{

returnfalse;

}

}

/** * 从Request对象中获得客户端IP,处理了HTTP代理服务器和Nginx的反向代理截取了ip * @author khy * @createTime 2020年6月15日下午2:29:51 * @param request * @return */

private String getRealIp(HttpServletRequest request){

//String ip = request.getHeader("cdn-src-ip");

String ip = request.getHeader("X-Real-IP");

if(StringUtils.isNotEmpty(ip)&&!"unKnown".equalsIgnoreCase(ip)){

return ip;

}

return request.getRemoteAddr();

}

}

4.WebMvcConfig.java

@Configuration

publicclassWebMvcConfigextendsWebMvcConfigurerAdapter{

@Autowired(required=false)

private IpAddressInInterceptor ipAddressInInterceptor;

@Override

publicvoidaddInterceptors(InterceptorRegistry registry){

if(null != ipAddressInInterceptor){

registry.addInterceptor(ipAddressInInterceptor)

.addPathPatterns("/**")//标识拦截所有

.excludePathPatterns("/","/test/**");//标识设置的请求不被拦截;

}

}

/** * 标识只有spring.profiles.active = prod 的时间当前对象才会被初始化 * @author khy * @createTime 2020年6月15日下午2:44:15 * @return */

@Bean("ipAddressInInterceptor")

@Profile(value="prod")

public IpAddressInInterceptor initInterecptor(){

IpAddressInInterceptor interceptor =newIpAddressInInterceptor();

return interceptor;

}

}

实现的原理内容

通过前面两篇文章我们通过maven打包实现加载不同环境的配置;通过maven 打包时指定 -P dev 我们选择使用dev环境的配置文件;同时application.properties文件中的
spring.profiles.active=@profileActive@
的profileActive 会被替换成打包指定的对于的环境的值

当前案例中默认的使用的是prod 的配置;
当我们打包的时间指定 -P dev ; application.properties文件中的spring.profiles.active=dev 在WebMvcConfig 中注入的
@Bean 注释的initInterecptor 方法并不会被执行;所以上面添加对于拦截器的时间给排除掉了;

以上是 第八课springboot通过@Profile注解配合maven打包的应用 的全部内容, 来源链接: utcz.com/z/518081.html

回到顶部