幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

变态需求给定一个接口,用户自定义动态实现上传热部署,咋搞?

  近期开发系统过程中遇到的一个需求,系统给定一个接口,用户可以自定义开发该接口的实现,并将实现打成jar包,上传到系统中。系统完成热部署,并切换该接口的实现
  定义简单的接口
  这里以一个简单的计算器功能为例,接口定义比较简单,直接上代码。publicinterfaceCalculator{intcalculate(inta,intb);intadd(inta,intb);}该接口的一个简单的实现
  考虑到用户实现接口的两种方式,使用spring上下文管理的方式,或者不依赖spring管理的方式,这里称它们为注解方式和反射方式。calculate方法对应注解方式,add方法对应反射方式。
  这里推荐一个SpringBoot基础教程:
  https:github。comjavastacksspringbootbestpractice
  计算器接口实现类的代码如下:ServicepublicclassCalculatorImplimplementsCalculator{AutowiredCalculatorCorecalculatorCore;注解方式Overridepublicintcalculate(inta,intb){intccalculatorCore。add(a,b);returnc;}反射方式Overridepublicintadd(inta,intb){returnnewCalculatorCore()。add(a,b);}}
  这里注入CalculatorCore的目的是为了验证在注解模式下,系统可以完整的构造出bean的依赖体系,并注册到当前spring容器中。CalculatorCore的代码如下:ServicepublicclassCalculatorCore{publicintadd(inta,intb){returnab;}}反射方式热部署
  用户把jar包上传到系统的指定目录下,这里定义上传jar文件路径为jarAddress,jar的Url路径为jarPath。privatestaticStringjarAddressE:zzqIDEAWSCalculatorTestlibCalculator。jar;privatestaticStringjarPathfile:jarAddress;
  并且可以要求用户填写jar包中接口实现类的完整类名。接下来系统要把上传的jar包加载到当前线程的类加载器中,然后通过完整类名,加载得到该实现的Class对象。然后反射调用即可,完整代码:热加载Calculator接口的实现反射方式publicstaticvoidhotDeployWithReflect()throwsException{URLClassLoaderurlClassLoadernewURLClassLoader(newURL〔〕{newURL(jarPath)},Thread。currentThread()。getContextClassLoader());ClassclazzurlClassLoader。loadClass(com。nci。cetc15。calculator。impl。CalculatorImpl);Calculatorcalculator(Calculator)clazz。newInstance();intresultcalculator。add(1,2);System。out。println(result);}注解方式热部署
  如果用户上传的jar包含了spring的上下文,那么就需要扫描jar包里的所有需要注入spring容器的bean,注册到当前系统的spring容器中。其实,这就是一个类的热加载动态注册的过程。另外,最新Spring面试题整理好了,大家可以在Java面试库小程序在线刷题。
  直接上代码:加入jar包后动态注册bean到spring容器,包括bean的依赖publicstaticvoidhotDeployWithSpring()throwsException{SetStringclassNameSetDeployUtils。readJarFile(jarAddress);URLClassLoaderurlClassLoadernewURLClassLoader(newURL〔〕{newURL(jarPath)},Thread。currentThread()。getContextClassLoader());for(StringclassName:classNameSet){ClassclazzurlClassLoader。loadClass(className);if(DeployUtils。isSpringBeanClass(clazz)){BeanDefinitionBuilderbeanDefinitionBuilderBeanDefinitionBuilder。genericBeanDefinition(clazz);defaultListableBeanFactory。registerBeanDefinition(DeployUtils。transformName(className),beanDefinitionBuilder。getBeanDefinition());}}}
  在这个过程中,将jar加载到当前线程类加载器的过程和之前反射方式是一样的。然后扫描jar包下所有的类文件,获取到完整类名,并使用当前线程类加载器加载出该类名对应的class对象。判断该class对象是否带有spring的注解,如果包含,则将该对象注册到系统的spring容器中。
  DeployUtils包含读取jar包所有类文件的方法、判断class对象是否包含sping注解的方法、获取注册对象对象名的方法。代码如下:读取jar包中所有类文件publicstaticSetStringreadJarFile(StringjarAddress)throwsIOException{SetStringclassNameSetnewHashSet();JarFilejarFilenewJarFile(jarAddress);EnumerationJarEntryentriesjarFile。entries();遍历整个jar文件while(entries。hasMoreElements()){JarEntryjarEntryentries。nextElement();StringnamejarEntry。getName();if(name。endsWith(。class)){StringclassNamename。replace(。class,)。replaceAll(,。);classNameSet。add(className);}}returnclassNameSet;}方法描述判断class对象是否带有spring的注解publicstaticbooleanisSpringBeanClass(Classlt;?cla){if(clanull){returnfalse;}是否是接口if(cla。isInterface()){returnfalse;}是否是抽象类if(Modifier。isAbstract(cla。getModifiers())){returnfalse;}if(cla。getAnnotation(Component。class)!null){returntrue;}if(cla。getAnnotation(Repository。class)!null){returntrue;}if(cla。getAnnotation(Service。class)!null){returntrue;}returnfalse;}类名首字母小写作为spring容器beanMap的keypublicstaticStringtransformName(StringclassName){StringtmpstrclassName。substring(className。lastIndexOf(。)1);returntmpstr。substring(0,1)。toLowerCase()tmpstr。substring(1);}删除jar时,需要同时删除spring容器中注册的bean
  在jar包切换或删除时,需要将之前注册到spring容器的bean删除。spring容器的bean的删除操作和注册操作是相逆的过程,这里要注意使用同一个spring上下文。
  代码如下:删除jar包时需要在spring容器删除注入publicstaticvoiddelete()throwsException{SetStringclassNameSetDeployUtils。readJarFile(jarAddress);URLClassLoaderurlClassLoadernewURLClassLoader(newURL〔〕{newURL(jarPath)},Thread。currentThread()。getContextClassLoader());for(StringclassName:classNameSet){ClassclazzurlClassLoader。loadClass(className);if(DeployUtils。isSpringBeanClass(clazz)){defaultListableBeanFactory。removeBeanDefinition(DeployUtils。transformName(className));}}}测试
  测试类手动模拟用户上传jar的功能。测试函数写了个死循环,一开始没有找到jar会抛出异常,捕获该异常并睡眠10秒。这时候可以把jar手动放到指定的目录下。
  代码如下:ApplicationContextapplicationContextnewClassPathXmlApplicationContext(applicationContext。xml);DefaultListableBeanFactorydefaultListableBeanFactory(DefaultListableBeanFactory)applicationContext。getAutowireCapableBeanFactory();while(true){try{hotDeployWithReflect();hotDeployWithSpring();delete();}catch(Exceptione){e。printStackTrace();Thread。sleep(100010);}}
  看完,涨姿势了没?
  原文链接:https:blog。csdn。netzhangzhiqiang0912articledetails106980080

东数西算大时代布局长牛东数西算在近期的市场认知中,被惯性的称为一个概念板块。但当我们稍微深入的去综观东数西算涉及的地理范围、产业链条、众多的上下游公司,就会发现它明显不会只是一个简单的阶段性概念时间……青山集团霸气回应全球镍逼空大战,反败为胜防止外资收割随着全球新能源电动车兴起,镍作为电池最重要成分也水涨船高,金属价格一路飙升!受俄乌战争影响,占据全球镍产量超过10的俄镍被禁运,供应端受限制从而进一步加剧全球金属镍价格!短短两……宁德时代即将发布麒麟电池能量密度快充使用寿命大幅提升宁德时代首席科学家吴凯在2022世界动力电池大会上表示,即将发布CTP3。0电池,即麒麟电池。在两块电芯的中间加水冷板,使相邻两块电芯的热传导降低,不会出现热失控;其二,……豆瓣评分8。8!刘亦菲新剧梦华录凭什么拿下高分?《梦华录》火了,自开播以来好评如潮,均集播放量破亿,豆瓣评分高达8。8。思密达确认引进,采用原音加字幕的方式在电视台和网络双线播出。该消息一爆出再次为《梦华录》增加了一波热度。……6月安卓手机好评榜出炉!三星OPPO位列前二,第三名没想到众所周知,市场口碑一直是大家了解数码风尚和选购新机的重要参考标准,如今随着7月份的到来,不少机构也是推出了相关的手机榜单。比如安兔兔近期就公布了一份6月Android手机好评榜……百强房企业绩半年考销售额同比下降过半,央企国企弯道超车刘伟发自北京2022年过半,房企面临业绩半年考。7月1日,根据机构统计的2022年上半年中国房地产企业销售排行榜,碧桂园位列榜首,期内全口径销售金额2469。9亿元……外界为什么对华为军团包打天下产生质疑,谈几点自己的看法近日华为煤矿军团全球总部暨山西区域总部项目正式签约落地太原晋阳湖畔,标志着华为将大举进军煤矿行业。华为煤矿军团董事长邹志磊表示现阶段华为首先解决煤矿行业最关心的安全,少人无人,……太空辐射威胁航天器关键电力部件安全运行,上电学者提出解决方案随着人类空间探索需求的日益增加,空间太阳能电站、宇宙飞船、空间站、通信和导航卫星等各种航天器需要长时间地在空间环境中运行。加之霍尔、离子和电弧等电力推进技术在通信卫星和深空探测……和平精英官宣联动中国航天神舟传媒,宇宙冒险即将启程重磅携手航天冒险即将启程6月27日,SPARK2022腾讯游戏发布会在线上盛大开启。在发布会上,作为腾讯游戏头部产品之一、一直致力于打造竞技冒险世界的《和平精英》,依然呈……中国养生学博大精深,这些方法都是有效中国养生学博大精深,许多方法都是非常有效!1、睡醒后赖床三分钟建议有高血压、心脏病的中老年人,睡醒后不要急于起身,而应先在床上闭目养神三分钟再起床。2、刷牙持……养老金补发在即,如果少于3000多涨200,达到6000不涨已经到6月底了,7月马上就要到了,各省市养老金调整补发还没有最新的消息。从当前形势看,今年的养老金调整注定与往年不一样,6月份调整补发的希望已经不大了,各地将会在7月份集中发布……1个好爸爸顶得上100个好老师,当爹的都应该看看著名心理学家格尔迪说:父亲是一种独特的存在,对培养孩子有一种特别的力量。从父亲的身上,孩子观察到什么是男人,什么是丈夫,什么是父亲,同时会思考什么是独立和勇敢。可以说,父亲是孩……
日本春季裙子分析,虽然都是秀场服装,却实用得很普通时尚的服装一直都是大家追求的,可惜的是本来能引导我们找到更时尚的服装的时尚秀场穿搭,已经成为最没有参考价值的服装了,因为大家都不像在日常生活中穿那些设计的很奇怪的服装。还……MacBookAir掉漆?等等,2024最轻薄Mac有望回归近日,有网友爆料,买回去的午夜版MacBookAir用了一周后,其触控板的边缘、雷电接口等位置掉漆十分严重,并且很容易在涂层留下指纹,观感不适。7月22日,据彭博社的马克……地球上,没有一座超过1万米高的山,山峰的高度被什么限制了?登山是许多人在休假时非常喜欢的一项户外运动,并且大部分的城市都有自己独具特色的山峰。更不用说我国的五岳,其风景各有千秋,多年以来引得无数文人墨客前去攀登题字。我们常说高瞻……2块钱的红霉素软膏怎么成了淡斑专家?医生道出了其中的答案红霉素软膏以红霉素、凡士林为主要成分,加入适量的软质液态石蜡为辅助成分,通过高温熬制、凝液而制成,适用于脓包疮化脓性皮肤疾病而导致的溃疡面积感染。医学市场售卖的红霉素软膏……王者荣耀6位英雄即将加强?这两件装备又又加强了王者早知道,山海来爆料,大家好我是山海体验服昨晚更新有7位英雄调整,前两天也有英雄和装备的调整,张飞专精装和影刃已经削弱,闪电匕首和寒霜侵袭有所加强,预计下周会同步到正式……万门大学,跑了?深燃(shenrancaijing)原创作者邹帅编辑唐亚华多年来深陷舆论漩涡的万门大学(以下简称万门),最近又被推上了风口浪尖。变化发生在3月22日。万……60的宝宝都会在夏天缺锌,高锌食物排行榜,建议宝妈们收藏宝宝6个月后,预防或治疗缺锌,最好的方法就是调整膳食,并按照辅食添加的原则,给宝宝适量吃一些富含锌的食物。含锌量高的食物大推荐1hr苹果水果是宝宝们普遍食欲较……解锁更多新玩法,石景山文旅消费季推出16条线路这里有离城最近的山,这里是离山最近的城。昨天,石景山区推出秀石景山文旅消费季,将区内众多特色科技、文化、商业、非遗传承场所纳入四大主题、16条线路中,丰富市民休闲生活。图……头条涨薪秘籍全网没有之一的pytest玩转数据驱动测试框架前言:嗨咯铁汁们,很久不见,我还是你们的老朋友,这里也感谢各位小伙伴的点赞和关注,你们的三连是我最大的动力哈,我也不会辜负各位的期盼,这里呢给大家出了一个我们……成功引入国资!股价大涨超30,胡葆森等来了白衣骑士苦苦挣扎了一年多之后,河南王建业地产终于等来了久违的白衣骑士。6月1日收盘后,在港股上市的建业地产发布公告称,公司第一大股东恩辉投资有限公司与河南同晟置业有限公司于202……金龟子要嫁女儿了!22岁女儿和初恋男友相恋9年,还有35cm没想到,金龟子刘纯燕的女儿都要结婚了。在《朋友请听好》第二季中,有一个是广播直播环节。除在现场的何炅、谢娜、张杰、王勉、董子健和井柏然外,还有明星嘉宾连线支持。这些来支持……莫言人生在世,注定要受许多磨难越是成功人,遭受磨难就越多大家好,麦田里的晚风第165篇文章,记得点赞与关注,不断为你分享生活哲理与乐趣。生活千篇万律,百态多变,好的坏的,我们都得统统收下。《福贵》改编自余华小说《活着》,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网