在最近的工作中,get到一个很实用的注解,分享给诸位。

痛点

做过微信或支付宝支付的童鞋,可能遇到过这种问题,就是填写支付结果回调,就是在支付成功之后,支付宝要根据我们给的地址给我们进行通知,通知我们用户是否支付成功,如果成功我们就要去处理下面相应的业务逻辑,如果在测试服务,那么这个回调地址我们就需要填写测试服务的,如果发布到线上那么我们就需要改成线上的地址。

针对上面的场景,我们一般都会通过如下的方式,进行一个动态配置,不需要每次去改,防止出现问题。

public class PayTest {

    @Value("${spring.profiles.active}")    private String environment;

    public Object notify(HttpServletRequest request) {

        if ("prod".equals(environment)) {            // 正式环境        } else if ("test".equals(environment)) {

            // 测试环境        }        return "SUCCESS";    }}

上面的代码看起来没有一点问题,但是身为搬砖的我们咋可能这样搬,姿势不对呀!

问题:

扩展性太差,如果这个参数我们还需要在别的地方用到,那么我们是不是还要使用@Value的注解获取一遍,假如有天我们的leader突然说吗,test这个单词看着太low了,换个高端一点的,换成dev,那么我们是不是要把项目中所有的test都要改过来,如果少还好,要是很多,那我们怕不是凉了。

所以我们能不能将这些配置参数搞成一个全局的静态变量,这样的话我们直接引用就好了,哪怕到时候真的要改,那我也只需要改动一处就好了。

注意大坑

有的朋友可能就比较自信了,那我直接加个static修饰下不就好了,如果你真是打算这样做,那你就准备卷好铺盖走人吧。直接加static获取到的值其实是一个null,至于原因,大家复习下类以及静态变量变量的加载顺序。

@PostConstruct注解

那么既然说出了问题,肯定就有解决方法,不然你以为我跟你玩呢。

首先这个注解是由Java提供的,它用来修饰一个非静态的void方法。它会在服务器加载Servlet的时候运行,并且只运行一次

改造:

@Componentpublic class SystemConstant {

    public static String surroundings;

    @Value("${spring.profiles.active}")    public String environment;

    @PostConstruct    public void initialize() {        System.out.println("初始化环境...");        surroundings = this.environment;    }}

结果:

我们可以看到在项目启动的时候进行了初始化

到这里我们已经可以拿到当前运行的环境是测试还是正式,这样就可以做到动态配置

最后想说

其实这个注解远不止这点用处,像我之前写的Redis工具类,我使用的是RedisTemplate操作Redis,导致写出来的方法没办法用static修饰,每次使用Redis工具类只能先注入到容器然后再调用,使用了这个注解就可以完美的解决这种尴尬的问题。代码如下。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/** * @ClassName RedisUtil * @Description TODO * @Auther bingfeng * @Date 2019/7/4/004 17:14 * @Version 1.0 */@Componentpublic class RedisUtil {

    private static RedisTemplate redisTemplates;    @Autowired    private RedisTemplate redisTemplate;    @PostConstruct    public void initialize() {        redisTemplates = this.redisTemplate;    }    /**     * 添加元素     *     * @param key     * @param value     */    public static void set(Object key, Object value) {        if (key == null || value == null) {            return;        }        redisTemplates.opsForValue().set(key, value);    }}

推荐阅读】

字符串、集合如何判断空值?看看成年人的正确操作

List如何根据属性排序?快来get吧

高效开发,超实用的一款IDEA开发插件

postconstruct_@PostConstruct注解,你该好好看看相关推荐

  1. @PostConstruct注解学习

    @PostConstruct注解好多人以为是Spring提供的.其实是Java自己的注解. Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法.被@Pos ...

  2. @PostConstruct注解学习,最详细的分享教程

    该注解可以实现在运行工程时,自动运行该注解下的方法: @PostConstruct是java自带的注解,指的是在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据 ...

  3. @PostConstruct注解详解

    简介 javaEE5引入了@PostConstruct和@PreDestroy两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作 使用场景 在项目中主要是在Servl ...

  4. @postconstruct注解方法没有执行_被标记为事务的方法互相调用的坑(下)

    上一节,主要分析了 被标记为事务的方法互相调用,事务失效的原因,思考比较多,这一节主要说说解决方案,思考会少一些. 解决方案的核心: 通过代理对象去调用方法 1.把方法放到不同的类: 如果想学习Jav ...

  5. java postconstruct_java的@PostConstruct注解

    从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的 ...

  6. Spring Boot中多个PostConstruct注解执行顺序控制

    项目场景: 多个类中 使用@PostConstruct加载先后顺序 问题描述 有时候Class A中@PostConstruct注解的方法中的代码执行,需要等待Class B中@PostConstru ...

  7. Java封装redis工具类RedisUtils,以及在@Postconstruct注解中调用redis可能出现redisTemplate空指针异常

    1.封装redis工具类RedisUtils import org.springframework.data.redis.core.RedisTemplate; import org.springfr ...

  8. Spring框架@PostConstruct注解详解

    文章目录 前言 业务背景 通过依赖查找实现 `@PostConstruct`注解实现 @PostConstruct注解原理 `@PostConstruct`注解 `@PostConstruct`注解源 ...

  9. java:@PostConstruct注解使用

    java:@PostConstruct注解使用 1 使用条件 1.1 方法是非静态方法 1.2 注解修饰的方法,不可以具有参数 否则抛错: Lifecycle method annotation re ...

最新文章

  1. 怎么使用CorelDRAW 中的默认调色板
  2. shell中遍历目录
  3. 中国最懂自动驾驶量产公司秀肌肉:自动驾驶算力怪兽、百亿参数云端超大模型、百万公里路测里程...
  4. FFmpeg学习5:多线程播放视音频
  5. 中国电动汽车充电桩行业十四五发展预测及未来战略规划建议报告2022-2027年版
  6. TCP/IP 协议栈及 OSI 参考模型详解
  7. 常用Git指令常用git命令清单
  8. python复习-正则表达式
  9. 董明珠再谈“格力10年免费包修”政策:没企业敢跟,实力的象征
  10. 爬取http://ycb-benchmarks.s3-website-us-east-1.amazonaws.com/的链接并下载文件
  11. 2021年度训练联盟热身训练赛第四场,签到题CDF
  12. 前端字体截取技术,做炫酷网站再也不用怕中文字体数据量大啦!【实战】
  13. 自学python在家干什么好_在家这么多天,职场人在家能自学什么?
  14. 【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展
  15. JavaScript对象与内置对象——内置对象(二)
  16. ios 高德挪动地图获取经纬度_IOS 地图移动中心点获取
  17. Oracle 分区表——Range分区
  18. 关于Office 365 显示语言的设置(注册开通时的语言选择及注册开通后的语言显示修改)
  19. 学好MySQL增删查改,争取不做CURD程序员【上篇】
  20. word之表格如何自动换页?

热门文章

  1. pdo mysql like_PHP PDO准备的语句-MySQL LIKE查询
  2. mysql逗号分隔函数_mysql split 函数(用逗号分隔)的实现
  3. linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本
  4. php mongodb 连接失败,解决PHP使用普通账号连接mongodb报错问题
  5. 星来客机器人餐厅_在50米高空聚餐,在铁窗内吃饭,盘点全球特色餐厅,看看有多奇葩...
  6. linux 复制文件 中文,linux中cp命令如何复制文件
  7. c语言的boolean_0基础学习C语言第四章:三种基本结构
  8. CurvLearn开源 | 阿里妈妈曲率学习框架详解
  9. nextcloud服务器处于维护模式,Nextcloud 加密开启与管理
  10. 一加7充电_刘作虎:一加7没有无线充电,Dash是最好的快充之一