SpringBoot项目预加载数据——ApplicationRunner、CommandLineRunner、InitializingBean 、@PostConstruct区别

0、参考、业务需求

  • 参考:
    http://www.cnblogs.com/java-chen-hao/p/11835120.html#_label1
    http://zhuanlan.zhihu.com/p/541268993

  • 业务需求:
    缓存数据字典数据、初始化线程池、提前加载好加密证书

1、方式

  • 实现 ApplicationRunner 接口
  • 实现 CommandLineRunner 接口
  • 实现 InitializingBean 接口
  • 使用 @PostConstruct 标签

2、@Order

  • 可以使用@Order注解或Ordered接口改变 ApplicationRunner 和 CommandLineRunner执行顺序
  • @Order 对 InitializingBean 和 @PostConstruct 不生效。

3、测试使用

  • ApplicationRunner
@Component
@Order(3)
public class App01 implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("App01_执行了……@Order(3)");
    }

}

@Component
@Order(2)
public class App02 implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("App02_执行了……@Order(2)");
    }
    
}
  • CommandLineRunner
@Component
@Order(1)
public class Com01 implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Com01_执行了……@Order(1)");
    }

}

@Component
@Order(0)
public class Com02 implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Com02_执行了……@Order(0)");
    }

}
  • InitializingBean
/** @Order没用
 * @author CC
 * @since 2023/5/17 0017
 */
@Component
@Order(7)
public class Ini01 implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Ini01_执行了……@Order(7)");
    }

}

/** @Order没用
 * @author CC
 * @since 2023/5/17 0017
 */
@Component
@Order(4)
public class Ini02 implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Ini02_执行了……@Order(4)");
    }

}
  • @PostConstruct
/** @Order没用
 * @author CC
 * @since 2023/5/17 0017
 */
@Component
@Order(6)
public class Pos01 {

    @PostConstruct
    public void customizeName(){
        System.out.println("Pos01_执行了……@Order(6)");
    }
    
}

/** @Order没用
 * @author CC
 * @since 2023/5/17 0017
 */
@Component
@Order(5)
public class Pos02 {

    @PostConstruct
    public void customizeName(){
        System.out.println("Pos02_执行了……@Order(5)");
    }
    
}

4、执行顺序、建议使用


  • 通过实现得出执行顺序
InitializingBean > @PostConstruct > ApplicationRunner > CommandLineRunner
  • 没有执行顺序要求,使用:@PostConstruct
  • 有执行顺序要求,使用:ApplicationRunner(推荐)或者CommandLineRunner
本文转载于网络 如有侵权请联系删除

相关文章

  • Spring集成MyBatis

    大家好,又见面了,我是你们的朋友全栈君。回忆MyBatis定义表user定义pojo实体类User在dao层定义UserMapper接口接口对应的Mapper映射文件在Dao接口的包中创建MyBatis的映射文件UserMapper,命名与接口名相同,本例为UserMapper.xml。mapper中的namespace取值也为Dao接口的全限定性名。定义MyBatis主配置文件在resources下定义MyBatis的主配置文件,命名为mybatis-config.xml。<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <packagename=&qu

  • Android+NDK+OpenGLES开发环境配置

    大家好,又见面了,我是全栈君。1、资源(1)、Android的eclipse开发环境我用adt-bundle-windows-x86。官方主页就能下载。这是一个打包的版本号,直接执行eclipse.exe你可以开始(2)、NDK下载NDK(大家网上下载一下)(3)、cygwin64用于模拟linux执行环境(大家网上下载一下)2、环境配置(1)eclipse导入项目导入NDKexample中的HelloGl程序(2)编译C++代码a、打开cygwin终端(mintty.exe)b、执行cd/cygdrive/e/android/wps2/HelloGL(转到sample的HelloGL的文件夹。当中e/android/wps2/HelloGL是你样例的文件夹)c、进行c++编译执行/cygdrive/e/android/android-ndk-r8/ndk-build编译c++的gl代码3、run右键project,弹出菜单RunAndroidApplication注意点:能够在终端执行setNDK=/cygdrive/e/android/android-ndk-r8/exportND

  • Do not concatenate text displayed with setText,use resource string with placeholders.

    警告大意:应该使用资源字符串来显示文本占位符与在xml布局中直接写汉字的警告是一个意思字符串拼接也好,直接写的汉字也好,都应该在strings.xml文件中声明,然后引用forexample:layout.xml文件引用strings.xml文件中声明关于变量拼接参数比如:mTextView.setText("距离过年还有"+mDay+"天"+mMinute+"时"+mSecond+"秒");复制 声明:<stringname="delay_time">距离过年还有%1$d天%2$d时%3$d秒</string>复制 在代码中的使用:mTextView.setText(String.format(getResources().getString(R.string.delay_time),mDay,mMinute,mSecond));复制声明在前,参数在后 常用格式: %n$s--->n表示目前是第几个参数(比如%1$s中的1代表第一个参数),s代表字符串 %

  • Ext JS 4 架构你的应用 第2节 (官方文档翻译)

    原文地址:http://docs.sencha.com/extjs/4.0.7/#!/guide/mvc_pt2【翻译by明明如月QQ605283073 本章节配套项目代码将在第3节给出】上一节:ExtJS4架构你的应用第1节(官方文档翻译)下一节:ExtJS4架构你的应用第3节(官方文档翻译)在上一篇文章中我们介绍了,怎样基于ExtJS构建一个潘多拉风格的应用。让我们探讨一下Model-View-Controller(模型-视图-控制器)架构以及怎样将其应用到相对复杂一点的含有多个视图和模型的UI应用中。 定义你的应用  在ExtJS3中 Ext.onReady是应用的入口,开发者也不得不自己设计一个应用架构。  在 ExtJS4中我们介绍了一种类似MVC模式的架构。这个模式将帮助我们创建应用的最佳实践。通过新的MVC包编写应用的切入点使用的是Ext.application方法。该方法将为你创建一个Ext.app.Application 实例。页面加载完成以后将会触发此启动方法。应该用此方法来代替以前的Ext.onReady ,在此方法中添加自动创建一个viewport和设置命名空间

  • 在Windows系统中愉快的运行Linux 系统

    大家好,我是IT共享者,人称皮皮。前言 曾经的小编一直都是使用Windows系统,但是当很多人都在我耳边说,用Linux吧,Windows不行;当时不由得怒火朝天,不是因为我在用Windows,而是别人这样说不就等于说用WIndows的男人不行吗?这谁忍得住,要知道,一个男人最忌讳的就是别人说它不行,不管男人女人都不能说,就好比不能说女生胖啊,丑啊啥的,毕竟咱们要学会尊重别人这样才会受到别人的尊重;当然,如果你是一个吊儿郎当的人的话,上面的话当我放屁。哈哈,言归正传,今天小编决定带大家玩一玩Linux系统,不过不是在虚拟机中装Linux系统,下面跟小编一起来看看吧。一、系统自带想必用过Windows10的人都应该知道了,它里面就自带了Linux系统哦,无需你再去安装,是不是很方便,如图:虽然小编没有Windows10系统,但是这点小编还是知道的,别不信,信小编得永生。 二、虚拟机 这个我想大家应该都不陌生了吧,VirtualMachine,是非常有名的虚拟机软件,我们可以通过在虚拟机中安装操作系统,模拟一个真实的系统环境从而进行操作,虽然很方便,但是资源占用率太高,不在小编的考虑范畴内

  • 【Django models】QuerySet API详解-filter、exclude、annotate

    QuerySet API详解-filter、exclude、annotate:在使用QuerySet进行查找操作的时候,可以提供多种操作。比如过滤完后还要根据某个字段进行排序,那么这一系列的操作我们可以通过一个非常流畅的链式调用的方式进行。比如要从文章表中获取标题为123,并且提取后要将结果根据发布的时间进行排序,那么可以使用以下方式来完成:articles=Article.objects.filter(title='123').order_by('create_time')复制可以看到order_by方法是直接在filter执行后调用的。这说明filter返回的对象是一个拥有order_by方法的对象。而这个对象正是一个新的QuerySet对象。因此可以使用order_by方 法。那么以下将介绍在那些会返回新的QuerySet对象的方法。1.filter:将满足条件的数据提取出来,返回一个新的QuerySet。具体的filter可以提供什么条件查询。请见查询操作章节。 2.exclude:排除满足条件的数据,返回一个新的QuerySet。示例代

  • 完整解读腾讯架构大变革!向云要钱,向AI+5G要命,向技术驱动转型

    李根夏乙乾明发自凹非寺 量子位报道|公众号QbitAI山雨欲来风满楼,兜兜转转至天明。昨晚腾讯架构调整消息抢跑后,鹅厂今早6点,日出之时搞事情。为何如此仓促又神秘?毕竟腾讯要搞组织架构调整,消息已不是一天两天。而且马化腾在去年年会上就说得清楚:在管理方面,我们面临最大的问题是内部的组织架构,现在的腾讯需要更多ToB的能力,要在组织架构上进行从内到外系统性的梳理。然而恐龙转身,说易行难,差不多一年时间,腾讯才把组织架构梳理清楚。现在,即将迎来20岁生日的腾讯,给出了新架构。核心要点有3个:一、原先7大事业群将变为6个。二、2C起家的腾讯2B转型,内部趋势判断:消费互联网向产业互联网转型,云业务将成为核心引擎。三、这将是面向未来20年做出的转型,向云而生,向AI、5G而生,向技术转型而生。而且细节中,或许也暗含着新趋势下的机会。具体调整、影响,以及腾讯历次趋势判断,我们一项项抽丝剥茧。新架构:面向未来20年对于这次腾讯组织架构调整,普遍被视为腾讯6年来首次大规模变革。调整前的腾讯组织架构:调整后的腾讯组织架构: 个中变化,可谓再清楚不过。 首先,完全新增了云与智慧产业事业群CSIG)和平台

  • 3.4 VR扫描:Steam调查:Rift和Windows VR份额持续增长;人民网推出“AR看两会”

    Steam调查:Rift和WindowsVR份额持续增长近日,ValveSteam最新调查数据显示,Rift和WindowsVR头显在Steam月度联网头显市场的份额持续增长,主要是从Vive和VivePro抢夺市场份额。与1月销量的纪录相比,2月的销量略有下降,从占Steam用户总数的0.91%降至0.89%。就平台上不同头显的市场份额而言,Rift和WindowsVR头显在今年2月的市场份额遥遥领先。VRPinea独家点评:价格差异是部分因素,2月比上月少3天也是销售量略有所下降的一个原因。OculusQuest运行速度显著快于OculusGo日前,Oculus的内容生态系统总监克里斯·普鲁厄特在官方论坛举行了一次AMA问答活动。其在与网友的互动中提到,OculusQuest的运行速度将显著快于OculusGo,并再次明确Quest的商店发行申请流程只针对这款头显,OculusRift和OculusGo不受影响。据悉,普鲁厄特无法及时回答所有问题,但其保证将尽量回复大家疑问,感兴趣的用户可以访问Oculus的官方论坛。VRPinea独家点评:关于OculusQuest的消息频出,对

  • 我连敲3年代码, 工资却不如刚入职的TA!

    以太坊让世人第一次知道了智能合约的概念,为了支持智能合约,以太坊必须把自己变的特别像一台计算机,那么全球的节点连接到一起,怎么能像一个计算机呢?那就是使用EVM(以太坊虚拟机)技术,让每个节点的链表上可以运行智能合约的指令。全球的以太坊节点连接起来,也就形成了全球计算机。对有一定编程经验的人来说,Solidity开发绝对不是什么难事。Solidity确实极容易上手,但是确实有很多细节需要注意的。一个智能合约是怎样部署到以太坊网络的呢?以太坊智能合约可以通过编辑器经过rpc远程调用(默认用8545端口)发布到geth节点上,最终在以太坊网络中运行。 众所周知,我们在以太坊上执行智能合约是需要消耗gas的,也就是说没有以太是不能运行的,这对很多童鞋来说表示难以理解。其实这涉及到经济系统的利益问题,我们执行了一个指令,整个网络都要同步数据,而这些指令是需要矿工进行打包交易的,如果矿工的利益不能保证,最后也就将导致整个网络无人维护。那么问题又来了,矿工有利益,开发者的收益如何实现呢?这就要具体问题具体分析,有些需求是为了保证数据存储在区块链上永不丢失,这个是保存类价值。对于开发者来说,开发出来

  • 谷歌AI版“你画我猜”背后是什么样的原理?

    我们先看看这个小程序是什么,打开微信小程序搜索页面,搜索“猜画小歌”,打开这个小程序,点击开始作画。小程序会先出题,告诉你画什么,20秒倒计时,你画完内容,然后谷歌AI去猜,如果猜的答案和题目匹配,则通过,进入下一题,否则失败。乍一看,怎么像是在考我的绘画能力呢,哈哈。第一道题,让我画帆船,惜败...再来一遍,钻戒,惨败...GoogleAI谷歌总是善于用人民群众喜闻乐见的方式“秀晒炫”自己的AI能力,这是来自GoogleAI的一款有趣的社交微信小程序,用户可以在有限的时间内进行速写涂鸦,在每一轮体验中,用户需要在规定时间内勾勒出一幅日常用品的图画(比如狗、钟表或鞋子),人工智能则需要在时间结束前猜出图画中的物体。如果你画的东西在20秒内被谷歌人工智能猜中,则过关,反之游戏结束,还有排行榜来统计你的闯关数在好友中的排名,这也是微信小游戏一贯的社交板块。如上图,游戏操作简单,接下来就是和AI达成默契进行“你画我猜”,如果多轮猜中,你就会进行连续的游戏解锁,然后登上朋友圈排行榜巅峰,考验各位“灵魂画手”的时候到了。 当然,也有哭着喊着让大家给评评理的,人工智能没有猜出来的这些画作,到底是谁

  • 一文读懂Python装饰器由来(一)

    Python装饰器是非常不错的特性,熟练掌握装饰器会让你的编程思路更加宽广,程序也更加pythonic。下面就让我们一起来探讨一下python的装饰器吧。装饰器的存在是为了适用两个场景,一个是增强被装饰函数的行为,另一个是代码重用。先看一个例子,直观的感受一下:importtime defout_wrapper(func): definner_wrapper(): start_time=time.time() func() stop_time=time.time() print('Usedtime{}'.format(stop_time-start_time)) returninner_wrapper @out_wrapper deftest1(): time.sleep(1) print('Iamtest1!')复制输出:Iamtest1! Usedtime1.0000572204589844复制这个装饰器是用来计算函数执行时间的。原本test1函数只是休眠1秒,然后输出字符串,但是在使用装饰器(out_wrapper)后,它的功能多了一

  • 让Python猜猜你是否能约会成功

    我是一个婚恋网站的数据分析师,新入职的第二天,接到老板的任务,让我预测来婚恋网站新注册的男生&女生是否会约会成功。如何预测一个新来的男生是否会约会成功呢?这很简单,只需要调出一下数据库中之前注册网站的会员信息及跟踪情况,看看和这个新来的男生条件最接近的男生是否约会成功了,那么就可以大致预估新来的男生是否会约会成功。中国有句老话叫做“近朱者赤,近墨者黑”,正是这个道理。比如下图,假设我们将男生的条件划分为三个维度,颜值、背景和收入。蓝色点代表约会成功,灰色点代表未约会成功。红色点代表新来的男生,他和两个蓝色点,一个灰色点最接近,因此点约会成功的可能性是2/3。KNN算法简介上述思路所用到的数据挖掘算法为KNN算法,KNN(KNearestNighbor),K最邻域法属于惰性算法,其特点是不事先建立全局的判别公式和规则。当新数据需要分类的时候,根据每个样本和原有样本的距离,取最近K个样本点的众数(Y为分类变量)或者均值(Y为连续变量)作为新样本的预测值。实做KNN只需要考虑以下三件事情:1.数据的前处理数据的属性有Scale的问题,比如收入和年龄的量纲单位不同,则不能简单的加总来计

  • gRPC(Java) keepAlive机制研究

    基于javagRPC1.24.2分析 结论 gRPCkeepAlive是grpc框架在应用层面连接保活的一种措施。即当grpc连接上没有业务数据时,是否发送pingpong,以保持连接活跃性,不因长时间空闲而被Server或操作系统关闭 gRPCkeepAlive在client与server都有,client端默认关闭(keepAliveTime为Long.MAX_VALUE),server端默认打开,keepAliveTime为2小时,即每2小时向client发送一次ping //io.grpc.internal.GrpcUtil publicstaticfinallongDEFAULT_SERVER_KEEPALIVE_TIME_NANOS=TimeUnit.HOURS.toNanos(2L); 复制 KeepAlive的管理使用类io.grpc.internal.KeepAliveManager,用于管理KeepAlive状态,ping任务调度与执行. Client端KeepAlive 使用入口 我们在使用io.grpc框架创建grpc连接的时候,可以设置keepl

  • 远离魔咒,见微知著,打造崭新的罗浮宫

    说说我们在维护一个庞大的系统过程中遇到的问题以及自己的一点想法。   先从design说起吧。 与design相关的概念根据其涉及的对象主要分为三类: SOLID, 低层次的,单个或者多个类间的,设计原则, 设计模式,中层次的,多个类间的,单个模块或者多个模块间的,设计模式, 架构设计,模块、系统层次的设计模式。 SOLID是agiledesign的一些原则。 agiledesign不是软件开发过程中的某个阶段,而是对code持续改进的一种PROCESS。   SOLID应该发生在coding的各个阶段,包括第一次实现,fixbug,增加feature,以及其他的一些维护性动作。 TDD是coding的策略,是一个从无到有,从微观到宏观的过程;他完全不是先有了一些预期,或者highleveldesign后的“照章”执行。 TDD而是根据需求写code,逐个Userstory,task去实现的一个过程。 这个过程包括功能的划分,design,类的识别等.   BabyStep是TDD的策略。 由于人脑的工作记忆容量有限,所以假设一次BabySt

  • JAVA加解密 -- 消息摘要算法

    消息摘要算法是一种单向加密算法 主要用于验证数据完整性,也是数字签名的核心算法 消息鉴别:指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行对比 a.MD家族–MD5(128位摘要信息) MD算法的作用流程 publicclassMDFamily{ privatestaticfinalStringstr="鲤鱼精"; publicstaticvoidmain(String[]args){ jdkMD("MD5"); ccMD5(); jdkMD("MD2"); jdkMD("MD4"); bcMD4(); } publicstaticvoidjdkMD(Stringmd){ try{ if(md=="MD4"){ //在JDK中动态加入BCMD4 Security.addProvider(newBouncyCastlePQCProvider()); MessageDigestmessageDigest=MessageDigest.getInstance(md); byte[]md4=messageDigest.digest(str.getBytes()); Sys

  • 如何限制同一客户端登录的用户数量以及禁止同一用户同时在不同客户端登录?

    在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。具体一点就是:    1、在同一台电脑上一次只允许有一个用户登录系统,2、一个用户在同一时间只允许在一个客户端登录。    我最近做的一个系统就遇到了这样的问题,本来系统已经开发完成了,但是安全测评没有通过,就是因为没有做这两个限制。怎么来做这样的限制呢?我在网上找了很久,发现问这个问题的人很多,但是没有找到特别清楚的答案。后来自己摸索着,看了一些书,终于找到解决办法了。    要解决这个问题实际上不难,对于高手来说可能都懒得去说了,但是对于不熟悉web编程的人来说可能会困扰很久。下面我把我的解决办法说出来,供大家参考!    先介绍一下我那个系统的背景:j2ee,tomcat,没有用cookie。    首先确定解决这两个问题的基本思路:    1、要解决同一台电脑上只允许有一个用户登录系统,只有一

  • C++ STL——C++容器的共性和相关概念

    目录一STL容器共性机制二STL容器的使用场合三函数对象四谓词五内建函数对象六函数对象适配器 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一STL容器共性机制 STL容器所提供的值都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素的引用放入容器中,也就是说我们提供的元素必须能够被拷贝。 (1)除了queue和stack之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。 (2)通常STL不会抛出异常,需要使用者传入正确参数 (3)每个容器都提供了一个默认构造函数和默认的拷贝构造函数。 (4)大小相关的方法:size()返回容器中元素的个数,empty()判断容器是否为空 二STL容器的使用场合 vector deque list set multiset map multimap 典型内存结构 单端数组 双端数组 双向链表 二叉树 二叉树 二叉树 二叉树 可

  • luoguP5490扫描线

    扫描线板子题。注意两倍数组(不太清楚原理) 一位大佬的博客:https://blog.csdn.net/qq_38786088/article/details/78633478,讲的太好了。 1#include<iostream> 2#include<algorithm> 3#include<cstdio> 4 5usingnamespacestd; 6typedeflonglongll; 7 8constintMaxn=2e5+10; 9 10llread(){ 11llans=0;charlast='',ch=getchar(); 12while(ch<'0'||ch>'9')last=ch,ch=getchar(); 13while('0'<=ch&&ch<='9')ans=ans*10+ch-'0',ch=getchar(); 14if(last=='-')return-ans;returnans; 15} 16 17structnode{ 18llx,y1,y2,k; 19booloperator&

  • FPGA时钟分频(转)

    http://www.cnblogs.com/fpga/archive/2009/10/24/1589318.html 占空比为50%的分频  偶数分频比较简单 比如N分频,那么计数到N/2-1,然后时钟翻转,代码如下:  1 module even(clk_in,clk_out,rst_n); 2 input clk_in; 3 input rst_n; 4 output clk_out; 5  6 parameter N=6; 7  8 reg [3:0] cnt; 9 reg clk_out;10 11 always @(posedge clk_in or negedge rst_n) begin12 if(!rst_n)

  • Amanda Lounges (二分图染色+好题)

    题意: 给定n个点m条边的无向图(开始每个点都是白色) 下面m行给出边和边权,边权表示这条边所连接的2个点中被染成黑色的点数。 0表示染,1表示其中一个点染,2表示都染。 问:最少染多少个点可以满足上述的边权。若不存在输出impossible 思路: 首先处理所有边权为0和2的情况,这样处理后图中就只剩下边权为1的子图,任意染一个点,然后bfs一下把子图染掉即可。很多细节需要考虑,值得反复做!!! #include<bits/stdc++.h> usingnamespacestd; #defineinf0x3f3f3f3f #definelllonglong constintmaxn=400005; constdoubleeps=1e-8; constdoublePI=acos(-1.0); #definelowbit(x)(x&(-x)) structedge { intfrom,to,col,next; }e[maxn]; inthead[maxn],tot,c[maxn],ans,n,m; vector<pair<int,int>

  • 静态代理和动态代理

    代理模式主要应用的场景是:当某些类由于一些原因不方便直接访问或者修改,需要通过一个代理类作为桥梁,来实现间接访问并扩展功能。 静态代理 假设我们有一个游戏模块,包含各种不同类型的游戏,我们需要在游戏开始和结束的时候加入提示,让我们看看利用静态代理怎么实现这个需求: 上面的UML图定义了一个游戏接口(Game),格斗游戏类(FightingGame)和射击游戏类(ShootingGame)分别实现了该接口,代码如下: ```java publicinterfaceGame{ publicvoidplayGame(); } ``` ```java publicclassFightingGameimplementsGame{ publicvoidplayGame(){ System.out.println("FightingGame"); } } ``` ```java publicclassShootingGameimplementsGame{ publicvoidplayGame(){ System.out.println("ShootingGame"); } } ``` 假如我们要在

相关推荐

推荐阅读