第八课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=8080spring.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
@ConfigurationpublicclassWebMvcConfigextendsWebMvcConfigurerAdapter{
@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