@PostConstruct注解,你该好好看看
2020/4/8 17:01:40
本文主要是介绍@PostConstruct注解,你该好好看看,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在最近的工作中,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的时候运行,并且只运行一次。
改造:
@Component public 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 */ @Component public class RedisUtil { private static RedisTemplate<Object, Object> redisTemplates; @Autowired private RedisTemplate<Object, Object> 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); } } 复制代码
这篇关于@PostConstruct注解,你该好好看看的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-25TypeScript基础知识详解
- 2024-12-25安卓NDK 是什么?-icode9专业技术文章分享
- 2024-12-25caddy 可以定义日志到 文件吗?-icode9专业技术文章分享
- 2024-12-25wordfence如何设置密码规则?-icode9专业技术文章分享
- 2024-12-25有哪些方法可以实现 DLL 文件路径的管理?-icode9专业技术文章分享
- 2024-12-25错误信息 "At least one element in the source array could not be cast down to the destination array-icode9专业技术文章分享
- 2024-12-25'flutter' 不是内部或外部命令,也不是可运行的程序 或批处理文件。错误信息提示什么意思?-icode9专业技术文章分享
- 2024-12-25flutter项目 as提示Cannot resolve symbol 'embedding'提示什么意思?-icode9专业技术文章分享
- 2024-12-24怎么切换 Git 项目的远程仓库地址?-icode9专业技术文章分享
- 2024-12-24怎么更改 Git 远程仓库的名称?-icode9专业技术文章分享