如何在项目运行过程中动态修改邮箱发件人的配置信息

🎨领域:Java后端开发



在这里插入图片描述


🔥收录专栏: 框架
🐒个人主页:BreezAm
💖Gitee:https://gitee.com/BreezAm
✨个人标签:【后端】【大数据】【前端】【运维】

文章目录

    • 业务场景
    • 场景分析
      • 三、解决方案
        • 3.1 编写一个获取bean的工具类SpringUtil
        • 3.2 编写销毁bean和注册bean的工具类
        • 3.3 使用案例
    • 总结

业务场景

有这样一个业务场景,就是在项目运行的过程中动态修改邮箱的配置信息,目前面临的问题是项目运行以后不能动态修改邮箱发件人。

场景分析

在上面的业务场景中说到不能在项目运行的过程中动态修改邮箱发件人,造成这个问题的原因是该系统的邮箱配置信息是在application.yml中配置的,如下所示,一旦通过这种方式配置,想修改必须停掉项目,这就很麻烦,那么我们该如何解决呢?

  spring:mail:host: smtp.163.comusername: iefox.163.com #发件人邮箱地址password: # 密钥properties:mail:smtp:auth: truessl:enable: truestarttls:enable: truerequired: trueport: 465

在spring中可以通过销毁bean和重新注册bean的方式实现邮箱配置信息的更改,从而实现动态修改发件人邮箱。下面是实现步骤。

三、解决方案

3.1 编写一个获取bean的工具类SpringUtil

@Component
public class SpringUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringUtil.applicationContext = applicationContext;}public static Object getBean(String beanName) {return applicationContext.getBean(beanName);}public static <T> T getBean(Class<T> beanClass) {return applicationContext.getBean(beanClass);}public static <T> T getBean(String beanName, Class<T> beanClass) {return applicationContext.getBean(beanName, beanClass);}public static ApplicationContext getApplicationContext() {return applicationContext;}
}

3.2 编写销毁bean和注册bean的工具类

@Component
@Slf4j
public class BeanUtil {@Resourceprivate ApplicationContext applicationContext;/*** 注册bean** @param property bean的属性* @param beanName bean的名字* @param clazz    类实例*/public void registerBean(Map<String, Object> property, String beanName, Class<?> clazz) {destroyBean(beanName);//注册bean之前先销毁ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringUtil.getApplicationContext();DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(clazz);property.forEach(bdb::addPropertyValue);defaultListableBeanFactory.registerBeanDefinition(beanName, bdb.getBeanDefinition());}/*** 销毁bean** @param beanName bean的名字*/private void destroyBean(String beanName) {DefaultListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsBeanDefinition(beanName)) {beanFactory.destroySingleton(beanName);beanFactory.removeBeanDefinition(beanName);log.info("{}销毁成功", beanName);} else {log.info("{}销毁失败", beanName);}}/*** 获取bean工厂** @return 实例*/private DefaultListableBeanFactory getBeanFactory() {ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;return (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();}
}

3.3 使用案例

(1)注册bean

下面是注册bean的写法,当我们需要在项目运行过程中修改配置信息的时候,只需要写个controller方法调用修改即可。

@Autowired
private BeanUtil beanUtil;
  Map<String, Object> property = new HashMap<>();property.put("host","smtp.163.com");property.put("port","465");property.put("protocol","");property.put("username","xiaoming@163.com");property.put("password","");beanUtil.registerBean(property,"mainBean",JavaMailSender.class);//注册bean

(2)发送邮件

 JavaMailSender mailSender = (JavaMailSender) SpringUtil.getBean("mailBean");//通过名字获取beanSimpleMailMessage message = new SimpleMailMessage();message.setSubject("主题");message.setFrom("xiaoming@163.com");message.setTo("dashi@163.com");message.setText("你好");mailSender.send(message);

总结

上面是一个通用的工具类,在这里只是拿邮箱发件人动态修改举例,其实在业务场景中还有很多类似于这样的场景,例如OSS对象存储服务配置信息的动态修改等等,都可以采用这种方式解决。

🔥收录专栏:框架
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos/Red Hat7/8.x 安装、配置、启动Gitlab14.x (语言和主题配置)

接上一篇&#xff1a;Centos/Red Hat7/8.x 安装、配置、启动Gitlab14.x 文章目录1. 简体中文2. 个性化主题1. 简体中文 2. 个性化主题

Hive数据如何同步到MaxCompute之实践讲解

摘要&#xff1a;本次分享主要介绍 Hive数据如何迁移到MaxCompute。MMA&#xff08;MaxCompute Migration Assist&#xff09;是一款MaxCompute数据迁移工具&#xff0c;本文将为大家介绍MMA工具的功能、技术架构和实现原理&#xff0c;再通过实际操作MMA&#xff0c;演示将Hiv…

CPU 明明 8 个核,网卡为啥拼命折腾一号核?

作者 | 编程技术宇宙责编 | Carol封图 | CSDN 下载自视觉中国中断机制我是CPU一号车间的阿Q&#xff0c;我又来了&#xff01;我们日常的工作就是不断执行代码指令&#xff0c;不过这看似简单的工作背后其实也并不轻松。咱不能闷着头啥也不管一个劲的只管执行代码&#xff0c;还…

2684亿销售额背后的阿里AI技术

人工智能生态发展趋势 大家好&#xff0c;我是林伟&#xff0c;我今天演讲的主题是《AI 突破无限可能—5 亿消费者的云上双 11》。我本人是做系统出身的&#xff0c;但在最近的一些会议上发现&#xff0c;越来越多做系统出身的人开始研究 AI。在 90 年代末的那波热潮里&#x…

FTP多用户权限 linux环境 一站式解决方案(基础篇)

需求背景&#xff1a;第三方厂商中国移动、电信、联通、微软、京东与我司内部进行接口交易&#xff0c;采用ftp协议&#xff0c;外部厂商负责上传文件&#xff0c;内部系统负责下载各厂商上传的文件。 文章目录一、用户与目录1. 用户与目录约定2. 用户创建3. 用户密码4. 创建用…

gateway集成nacos、loadbalancer实现自定义负载均衡器,带源码解析(cloud版本:2021.0.3|boot版本:2.7.4)[场景1:灰度发布(金丝雀发布)]

&#x1f3a8;领域&#xff1a;Java后端开发&#x1f525;收录专栏&#xff1a; 系统设计与实战 &#x1f412;个人主页&#xff1a;BreezAm &#x1f496;Gitee&#xff1a;https://gitee.com/BreezAm ✨个人标签&#xff1a;【后端】【大数据】【前端】【运维】 文章目录前言…

高德服务单元化方案和架构实践

导读&#xff1a;本文主要介绍了高德在服务单元化建设方面的一些实践经验&#xff0c;服务单元化建设面临很多共性问题&#xff0c;如请求路由、单元封闭、数据同步&#xff0c;有的有成熟方案可以借鉴和使用&#xff0c;但不同公司的业务不尽相同&#xff0c;要尽可能的结合业…

免费直播:1小时带你体验Python车牌识别实战

Python基础学会了&#xff0c;实战又是爬虫&#xff1f;太枯燥&#xff1f;别无聊&#xff0c;CSDN学院邀请章秀淞老师开设技术直播课&#xff1a;1小时带你体验车牌识别实战。让你从众多车中&#xff0c;能用Python技术找到夏树上的那辆叔叔的奔驰车牌&#xff08;玩笑&#x…

IDEA 断点调试高级玩法 |debug高手必看!

文章目录条件表达式//条件表达式public static void main(String[] args) {for (int i 0; i < 10; i) {System.out.println(i);}} }需求1&#xff1a; 当i2时&#xff0c;断点停顿 添加断点&#xff0c;鼠标右击添加自定义条件即可 需求2&#xff1a; 当i偶数时&#xff…

听说了吗?阿里双11作战室竟1根网线都没有

双11不光是购物狂欢节&#xff0c;更是对技术的一次“大考”&#xff0c;对于阿里巴巴企业内部运营的基础保障技术而言&#xff0c;亦是如此。 回溯双11历史&#xff0c;这背后也经历过“小米加步枪”的阶段&#xff1a;作战室从随处是网线&#xff0c;交换机放地上的“一地狼…

如何给U盘设置一张妖娆又骚气的图标

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 &#x1f4a1;介绍 设置完就这样&#xff0c;看起来有些巴适&#xff0c;其实没啥用&#xff01;&#xff01; &#x1f3a8; 一、准备工作 百度上找一张妖娆的图片将图片转换成图标文件&#xff08;.ico格式&#…

最佳实践 | 数据库迁云解决方案选型 流程全解析

Oracle是非常强大的综合数据库&#xff0c;但同时也存在一些劣势&#xff0c;比如由于采用集中式架构&#xff0c;无法很好地实现横向扩展&#xff0c;并且其稳定性依赖于硬件。出于架构升级、降低成本和云化等需求&#xff0c;越来越多的企业需要“去Oracle”。 日前&#xff…

Centos7.x 在线安装Docker和离线安装 Docker

文章目录一、在线安装二、联网下载软件2.1. 下载rpm2.2. 安装 docker2.3.测试验证一、在线安装 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyunsystemctl enable docker systemctl s…

没错!Python杀死了Excel!

月前&#xff0c;日本最大的证券公司之一野村证券首席数字官马修汉普森&#xff0c;在Quant Conference上发表讲话&#xff1a;“用Excel的人越来越少&#xff0c;大家都在码Python代码。”甚至直接说&#xff1a;“Python在数据分析领域正在超越Excel&#xff01;”作为一门胶…

给 K8s API “做减法”:阿里巴巴云原生应用管理的挑战和实践

早在 2011 年&#xff0c;阿里巴巴内部便开始了应用容器化&#xff0c;当时最开始是基于 LXC 技术构建容器&#xff0c;然后逐渐切换到 Docker&#xff0c;自研了大规模编排调度系统。到了 2018 年&#xff0c;我们团队依托 K8s 体系开始推进“轻量级容器化”&#xff0c;同时投…

VMware 快照

文章目录1. 拍摄快照2. 将此虚拟机恢复到快照3. 管理此虚拟机的快照1. 拍摄快照 2. 将此虚拟机恢复到快照 3. 管理此虚拟机的快照

基于OOS批量修改资源标签值

场景 当资源上有个标签键: 部门&#xff0c;标签值&#xff1a;零售&#xff0c;由于部门资源整合要把标签&#xff08;键: 部门&#xff0c;值&#xff1a;零售&#xff09;修改为标签&#xff08;键: 部门&#xff0c;值&#xff1a;新零售&#xff09;&#xff0c;如何快速…

首度公开!OceanBase存储系统架构的演进历程及工程实践

随着用户数据量的不断增长&#xff0c;基于传统共享存储的纵向扩展能力渐渐变得力不从心&#xff0c;分布式存储成为应对用户海量数据的标配。 作为一位架构师&#xff0c;在设计系统的分布式存储架构时&#xff0c;需要关注哪些方面呢&#xff1f;或者我们换句话说&#xff0c…

Java“拍了拍”你,面试其实没那么难...

后疫情时代&#xff0c;连程序员这个多金的职业也遭受到了一定程度的打击。从各大招聘网站和多次面试经历中&#xff0c;相信大家已经意识到&#xff0c;面试官对程序员技能体系和项目经验考核似乎更严苛了。你在面试中常常为什么苦恼呢&#xff1f;简历撰写&#xff1f;数据算…

双 11 模块 79.34% 的代码是怎样智能生成的?

导读&#xff1a;作为今年阿里经济体前端委员会的四大技术方向之一&#xff0c;前端智能化方向一被提及&#xff0c;就不免有人好奇&#xff1a;前端结合 AI 能做些什么&#xff0c;怎么做&#xff0c;未来会不会对前端产生很大的冲击等等。本篇文章将围绕这些问题&#xff0c;…