范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

踩坑DependsOnOrder注解嵌套使用解决Bean加载优先级问题

  踩坑:@PostConstruct、@DependsOn、@Order注解嵌套使用案例
  今天在工作中写需求代码时,遇到的一个关于Sping Bean对象加载优先级问题,结合了Spring源码,大概总结了一下遇到Bean加载顺序需求问题时,比较常用的3个注解:@PostConstruct、@DependsOn、@Order。一、@Order注解的作用@Order注解的作用是定义Spring IOC容器中Bean的执行顺序的优先级。
  使用案例:@Component @Order(0) public class Test01 {    ... }  @Component @Order(1) public class Test02 {    ... }  @Component @Order(2) public class Test03 {    ... } 复制代码
  如上述代码所示,通过@Order注解定义优先级,3个Bean对象从IOC容器中的加载顺序为:Test01、Test02、Test03。二、@PostConstruct注解的作用@PostConstruct注解可以用于修饰一个非静态的、返回值类型为 void 的方法(eg:myInit())。该方法(myInit())会在服务器加载Servlet的时候被执行,且只会被执行一次!该方法(myInit())的调用执行在构造函数之后,在Servlet的 init() 方法之前,在Servlet的 destroy()方法之后。
  使用案例:@Component public class Test {    @PostConstruct    private void init() {       // 初始化       System.out.println("World!");    }        public Test(){        System.out.println("Hello");    } } 复制代码
  输出结果:Hello World! 复制代码三、@DependsOn注解的作用该注解的作用顾名思义,就是 "谁依赖谁"。假如在Test02类上加上@DependsOn(value = "test01"),那么就说明Test02在加载时,要依赖于Test01,Spring IOC 容器会优先加载Test01,然后再加载Test02。
  举个实际业务场景的案例,假设现在有2个类Test01、Test02,需要交给Spring IOC容器托管:/**  * Test01是一个拥有1个静态变量的类  */ @Component public class Test01 {     // 该静态变量的属性值需要通过Spring容器赋值,值(hello)定义在application.properties中。     // 注意:@Value注解不可以给静态变量注入属性值 (否则获取的注入结果为null) !     // 因此HELLO的属性值注入要在setter方法上加上@Value注解,参考文章:【https://blog.csdn.net/weixin_43591980/article/details/121503720】     public static String HELLO;        public static String WORLD;        @Value("${spring.test.hello}")// 值为hello     public void setHELLO(String hello) {         HELLO = hello;     }        @Value("${spring.test.world}")// 值为world     public void setWORLD(String world) {         WORLD = easak;     } } 复制代码
  再来看Test02类的代码(前提要求:Test02类需要在我们的Spring Boot项目启动时首先被初始化调用!):/**  * Test02拥有一个@PostConstruct注解修饰的init()初始化方法和无参构造函数  */ @Component public class Test02 {     @PostConstruct     public void init(){        ...     }        public Test02(){  				...      } } 复制代码
  业务需求:我需要在Test02的无参构造方法加载时,控制台打印Test01类中的HELLO静态变量值,然后在 init()方法执行时,控制台打印Test01类中的WORLD静态变量值。
  刚开始我的第一想法是,直接这样写就好了:@PostConstruct public void init(){    System.out.println(Test01.HELLO); }    public Test02(){  		System.out.println(Test02.WORLD); } 复制代码
  但是最终控制台打印的结果为:null null 复制代码
  Why?为什么是这个结果?因为,Test02类会在我们的Spring Boot项目启动时首先被初始化调用,也就是说IOC容器会首先去加载Test02对象,而这时候Test01还尚未被加载到容器中,这时候Test01中的两个静态变量HELLO、WORLD还没有通过@Value注解注入属性值,所以结果理所应当是输出 null
  解决方案:使用@DependsOn注解
  我们对Test02类进行改进:@Component @DependsOn(value = "test01")// 通过该注解,向Spring容器声明,该类的加载需要依赖于Test01,当加载Test02时,要先去加载Test01! public class Test02 {     @PostConstruct     public void init(){        System.out.println(Test01.HELLO);     }        public Test02(){  				System.out.println(Test01.WORLD);     } } 复制代码
  查看打印结果:hello world 复制代码
  注:也可以使用@Order注解给Test01、Test02类声明加载优先级,优先加载Test01,然后再加载Test02!

数据中台V3。6上线,提升业务数据化整体效率8月6日,云徙科技中台产品线宣布更新,正式发布云徙数据中台V3。6版本。该版本重点更新了数据工具线内的数据研发平台标签工厂和营销智能3个部分。其中1。数据研发平台1)源数据管理对业数字创新年会重磅嘉宾阿里副总裁肖利华深度讲解全速重构当前,数字化转型浪潮爆发。作为数字商业的新基建数字中台,已是各行各业落地数字化转型战略的共同选择。9月25日,今年中台赛道的第一大会2020云徙数字创新年会强势来袭!大会汇聚地产汽会员营销二次传播太难?全域会员帮你打破次员壁如今私域流量大火,忠诚且庞大的会员群体作为私域流量最好的转化渠道都是各大厂商用心呵护的心头肉。随着各种场景需求雨后丛生,厂商对于会员营销的相关需求十分强烈。9月2日,双中台领导者云云徙技术平台V3。6版本更新,后端测试效率再次提升8月6日,云徙科技宣布产品更新,正式发布技术平台V3。6版本。在技术平台V3。6版本中,数字化研发服务平台(iDP)测试管理中新增了自动化接口测试相关模块,重点包括1。支持接口自动经验不足工具弥补,营销画布预演助力市场营销提效对于商家来说,市场营销的好坏,直接决定着最终的销售业绩。在过去很长一段时间,市场营销的质量都是由市场营销人员来决定的。但是,人的经验和认知毕竟有限。一个经验再丰富的营销人,免不了也数字创新年会重磅嘉宾毕马威合伙人毛健拆解新零售未来发展2020年是中国新基建的元年。在国内国际双循环格局下,新基建作为引领经济转型升级的重要动力和新一代中国版信息高速公路的重要引擎,对国家经济和科技产业的重要性和长期价值不言而喻。数字全渠道交易3。6。0版本更新,库存问题无压力全渠道交易3。6。0版本在近日完成更新。本次更新实现了订单店铺仓库的更高效精准协同。3。6。0更新功能订单管理直接对接B2C商城,完成自营渠道订单下单发货全动作。库存管理实现了逻辑数字凝聚转型力,云上龙光已启程对绝大部分行业来说,2020走得很艰难。地产行业也不例外,数字云的新地产时代加速到来,在标杆房企的数字化构想里,数字化转型其中一个重要的场景就是所有核心业务流程都能实现在线管理,大乐歌绘画学习升降桌,电动升降小桌板,办公学习都轻松桌子呢相信屏幕前的所有小伙伴的家里都有,不管是书桌办工桌还是餐桌,每个家里多多少少都会有那么一张到几张桌子。虽然每个人的家里都有那么两台桌子,但不是每个人家里都有那么一台多功能的好大咖来了科特勒中国区总裁曹虎将担任2021数创会演讲嘉宾随着数字化转型进入深水区,数字化转型已不再是一场单纯的技术追逐战,而是要利用技术手段重构业务,提升消费者体验。消费者越来越注重产品和服务的即时可得性,谁能够低成本快速地提供超预期的荣耀30S上手玩颜值拍照性能5G,两千多块都能有!3月30日荣耀30S发布,这意味着荣耀在2020年首款5G新成员手机正式到来。荣耀30S首发了麒麟820处理器,还支持6400万像素全焦段AI四摄,这款手机的实际体验究竟如何?我们
家里打算换一台电视,TCLT7E好不好?好,很好。最好买它的98英寸的。屏幕也大也有面子,看电视打游戏一定爽歪歪。今年TCL的动作可以说很大了,个人认为新发布的T7E硬件简直绝了,它搭载了目前电视行业唯一一款能支持144花椒直播母公司花房集团二次递表,3年亏损10亿元,周鸿祎持股385月1日消息,花椒直播的母公司花房集团在4月29日第二次向港交所递交了上市招股书。他们曾在2021年10月25日首次递表,但那份材料在6个月后已经失效。据花房集团的招股书显示,他们爆肝手码!基于OpenCV的车牌识别(Sobel颜色定位),绝对干货车牌识别大体上需要经历过Sobel定位颜色定位SVM对定位来的候选车牌进行评测,给出评分,最后通过提取HOG特征按照训练模型进入ANN识别。这一章节介绍定位相关的逻辑代码,其中定位世上最美味的食物是什么?各人的胃口不一致,各地区生活习惯也不一样,上海人喜欢吃甜味,湘蜀人喜欢吃辣庥。人体虽要各种食物,蔬菜的营养成份,厚味则生湿。世界上最美味的东西是什么?谢谢邀请。这世界上最美味的东西如果腾讯推出了LINUXQQ和微信,功能和win下一样,中国境内操作系统的用户比例会有什么变化?没有如果,另外QQ有Linux版,只是很多年没更新过,你需要你也可以在Linux直接跑Windows版微信,就算有原生Linux版,比列也没有变化,真正有一天硬件厂商都预装,或者有微信为何一直不改进令人尴尬的删除好友功能?背后原因探秘微信早已融入人们的日常生活,其中的很多功能给我们的生活提供了诸多便利。但是有个功能,令很多人一直尴尬纳闷。它就是删除好友功能。随着微信功能的不断增加,添加好友的机会也越来越多,而同说说你不想用小米手机的原因?我一直用小米手机,感觉性价比高,会一直用的抠鼻用着呢,很好!因为我爱国,我只用华为看看miui现在越来越臃肿,10以前都非常好用,现在触感有些拖沓,早已不是行云流水的miui,小米想要保持好口腔的健康那么一款冲牙器是你必须准备的不知道已经吃过了多少的山珍海味,不知道已经吃过了多少的家常便饭,而且不知道已经坚持了多少年的每天刷牙,但是依旧牙齿还是会不干净,普通的牙刷根本无法清除掉牙缝内的死角,只能清除表面,LAICA莱卡KE9010一体机即热直饮,一次搞定健康用水问题水是生命之源,健康用水是一个非常大的问题,刚搬了新房子这边的供水经常有问题,特别是停水之后,来水总是非常浑浊,家里虽然装了前置过滤器净水器,但日常需要直接饮用凉水或者温水,以前都是电视行业未来之光,海信领跑激光电视产业,份额高达49根据洛图科技(RUNTO)数据,从2015到2021年中国激光电视市场年复合增长率高达155。8。这个数据强有力的说明了,与其他新型显示技术相比,激光显示技术具有明显的差异化技术优未来充电桩前景广阔?2022年中国新基建研究报告出炉十四五规划提出系统布局新型基础设施,加快第五代移动通信工业互联网大数据中心等建设。新基建具有强外部性效用外溢性公共产品属性受益范围广规模经济等特点,其基础性地位决定需要走在经济社会