spring启动时只执行一次的方法实现
spring项目如何在启动项目是执行一些操作,在spring中能通过那些操作实现这个功能呢。
1.方法一
我在spring的配置文件中添加上这条,这个配置只能在启动项目是执行一遍。
还有一点 要注意 这个方法不能是controller层的方法
<-- class是类的全名加包名 这是指定运行的方法在那个类里面 -->
<-- scope 值得范围 这里给的参数是 singleton -->
<-- inti-method 是指要执行的方法 -->
<bean id="startRun" class="com.shr.bojs.StartRun" scope="singleton" init-method="test"></bean>
package com.shr.jobs;
public class StartRun {
public void test(){
System.out.println("开始执行 startRun 方法!!!");
}
}
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
开始执行 startRun 方法!!!
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-nop-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2.方法二
使用@PostContruct ,在方法上添加@PostConstruct注解
注意 一定要放在能被扫面到的地方,如果你写在一个无法被扫描到的位置是不能执行的。(service层肯定能被扫描到)
@Service
public class TestRun{
@PostConstruct
public void text(){
System.out.println("项目开始运行我也就执行!!");
}
}
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-nop-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
项目开始运行我也就执行!!
五月 19, 2018 12:21:14 上午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring FrameworkServlet 'springMVC'
3.方法三
实现initiailzingBean接口。
afterPropertiesSet这个方法就会在项目启动时执行。
@Service
public class ArraignedLogService implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("我是通过实现接口 initializingBean来执行的!!!");
}
}
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-nop-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
我是通过实现接口 initializingBean来执行的!!!
五月 19, 2018 12:38:33 上午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring FrameworkServlet 'springMVC'
4.
因为需要保证所有调度相关的依赖注入spring容器才创建所以定时调度任务,所以需要实现在Spring容器将所有的Bean都初始化完成之后才自动执行一次执行方法(创建一个调度任务)
实现
实现ApplicationListener接口,并实现 onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)方法
@Service
public class SearchReceive implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
if (contextRefreshedEvent.getApplicationContext().getParent() == null) {//保证只执行一次
//需要执行的方法
}
}
}
至于为什么先做判断,因为Spring存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理
!
spring启动时只执行一次的方法实现相关推荐
- 【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!...
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 前言 目前 ...
- spring在项目启动时就执行特定方法
如何在项目启动时就执行特定方法 1. 方法上加注解@PostConstruct @Compant public class InitDemo{@PostConstructpublic void ini ...
- spring启动后自动执行一次方法
说明 spring启动后自动执行一次方法:因为需要保证所有调度相关的依赖注入spring容器才创建所以定时调度任务,所以需要实现在Spring容器将所有的Bean都初始化完成之后才自动执行一次执行方法 ...
- 如何在项目启动时就执行某些操作
参考资料:如何在项目启动时就执行某些操作 在实际的项目开发中经常会遇到一些需要在项目启动的时候进行初始化操作的需求,比如初始化线程池,配置某些对象的序列化和反序列化方式,加载黑名单白名单,加载权限应用 ...
- 解决ArcMap启动时只停留在初始化界面的方法
解决ArcMap启动时只停留在初始化界面的方法 参考文章: (1)解决ArcMap启动时只停留在初始化界面的方法 (2)https://www.cnblogs.com/luwl/p/6899342.h ...
- vm启动时通过U盘安装的方法
vm启动时通过U盘安装的方法 增加一个以U盘为硬盘的方法,通过boot中设置该硬盘启动后重新ghost或者安装win10X64位. 在虚拟机中增加一个硬盘,第二部设置为物理硬盘,选在对应的U盘.如果需 ...
- Spring Boot————Web应用启动时自动执行ApplicationListener用法
原文:<web服务启动spring自动执行ApplicationListener的用法> 引言 我们知道,一般来说一个项目启动时需要加载或者执行一些特殊的任务来初始化系统,通常的做法就是用 ...
- 如何在SpringWEB项目或者Springboot启动时直接执行业务代码(三种方式)
我的博客原文链接 前言 通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况.比如将数据库中的配置信息或者数据字典之类的缓存到redis,或者在服务启动的时候将一些配置化 ...
- 了解这些,你就可以在Spring启动时为所欲为了
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! Spring 是一个控制反转依赖管理的容器,作为 Java ...
最新文章
- altium designer 原理图和PCB 多通道设计
- 转译:Oracle 中 Object_iD 和 Data_Object_ID 的区别
- golang fmt格式“占位符”
- Python--12 内嵌函数和闭包
- java8方法引用符合_Java8 方法引用和构造方法引用
- centos7解决火狐浏览器fash安装问题
- 关于C++里面使用set_union,set_intersections、set_merge、set_difference、set_symmetric_difference等函数的使用总结
- UESTC1608 暑假集训
- 解决Unable to find taglib [cr] for URI: [WBE-INF/tlds/testlib.tld]] with root cause的可能性方案
- 数字图像处理吴娱课后答案_(完整版)数字图像处理每章课后题参考答案
- ps画画模糊笔刷_Photoshop绘图工具之模糊/锐化/涂抹工具
- python读取多张图片_Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片
- (转)中国IT界名人
- 独立安装的黑莓模拟器的上网方法
- BeanUtilsVo.copyProperties源码分析
- 【大学物理·早期量子论和量子力学基础】量子力学中的氢原子问题
- 帝国时代2战役php文件,帝国时代各种类型文件使用说明
- v-permission来做权限管理
- java 监控系统cpu,java系统监控CPU 磁盘
- PCR主成分回归预测MATLAB代码 代码注释清楚。 main为主程序,读取EXCEL数据
热门文章
- 使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户、物品的协同过滤推荐算法实现 大数据、人工智能、机器学习项目开发
- C++ stack pop()返回值 error: cannot initialize a variable of type ‘int‘ with an rvalue of type ‘void‘
- js使用BOS Uploader上传视频到百度云
- Matlab 入门 - data函数
- 什么是“软件定义汽车”
- activeMq 启动报 Wrapper Stopped
- 关于SNS概念的详细说明
- SPDR年内增量尽数被抹 市场看空金市
- 再见,北京,你好,沈阳
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02