ApplicationContextAware接口的拓展和使用
ApplicationContextAware接口只有一个方法:
public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
此接口的介绍:
不用类似new ClassPathXmlApplicationContext()的方式,从已有的spring上下文取得已实例化的bean。通过ApplicationContextAware接口进行实现。
当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
官方介绍的翻译:
接口由希望被其运行的ApplicationContext通知的任何对象实现。
实现这个接口是有意义的,例如,当一个对象需要访问一组协作bean时。请注意,通过bean引用进行配置比仅仅为了bean查找目的实现此接口更可取。
如果一个对象需要访问文件资源,例如,想要调用getResource,想要发布一个应用事件,或者需要访问MessageSource,这个接口也可以实现。然而,最好在这样一个特定的场景中实现更具体的ResourceLoaderAware、ApplicationEventPublisherAware或MessageSourceAware接口。
参数applicationContext—要被该对象使用的applicationContext对象
ApplicationContextAware接口的作用
实现**ApplicationContextAware
**接口。重写或继承里面的方法。
主要可以实现的功能:
- 根据byType获取byName获取Bean对象;
- 根据byName判断Bean对象是否存在;
- 根据bean对象的name获取type;
- 根据bean对象的type获取names;
需要注意的是,需要将这个类放入Spring容器中管理。即使用**@Component
**注解。
需要注意的是:name不是Bean对象的全限定名,而是Spring容器中的Bean名。
实现setApplicationContext此方法的类:
使用实例
@Slf4j
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {//DisposableBean :由希望在销毁时释放资源的bean实现的接口。
// BeanFactory将在对作用域bean的单独销毁时调用destroy方法。
// applicationcontext应该在关闭时释放它的所有单例对象,这是由应用生命周期驱动的。
//出于同样的目的,spring管理的bean也可以实现Java的AutoCloseable接口。
// 实现接口的另一种方法是指定自定义destroy方法,例如在XML bean定义中。private static ApplicationContext applicationContext = null;/*** 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.*/@SuppressWarnings("unchecked")public static <T> T getBean(String name) {assertContextInjected();return (T) applicationContext.getBean(name);}/*** 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.*/public static <T> T getBean(Class<T> requiredType) {assertContextInjected();return applicationContext.getBean(requiredType);}/*** 检查ApplicationContext不为空.*/private static void assertContextInjected() {if (applicationContext == null) {throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" +".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");}}/*** 清除SpringContextHolder中的ApplicationContext为Null.*/private static void clearHolder() {log.debug("清除SpringContextHolder中的ApplicationContext:"+ applicationContext);applicationContext = null;}@Overridepublic void destroy() {SpringContextHolder.clearHolder();}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {if (SpringContextHolder.applicationContext != null) {log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);}SpringContextHolder.applicationContext = applicationContext;}
}
使用这个上面类在线程对象中得到目标对象的方法,利用反射进行调用:
public class QuartzRunnable implements Callable {//在Execution类中使用QuartRunnable QuartzRunnable task = new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(),
// quartzJob.getParams());
// Future<?> future = EXECUTOR.submit(task);private Object target;private Method method;private String params;QuartzRunnable(String beanName, String methodName, String params)throws NoSuchMethodException, SecurityException {this.target = SpringContextHolder.getBean(beanName);this.params = params;if (StringUtils.isNotBlank(params)) {this.method = target.getClass().getDeclaredMethod(methodName, String.class);} else {this.method = target.getClass().getDeclaredMethod(methodName);}}@Overridepublic Object call() throws Exception {ReflectionUtils.makeAccessible(method);if (StringUtils.isNotBlank(params)) {method.invoke(target, params);} else {method.invoke(target);}return null;}
}
method.invoke(target, params):
对目标object执行方法method,参数为params
调用反射的方法:
@Async
public class ExecutionJob extends QuartzJobBean {//在QuartManage类中 JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class).
// withIdentity(JOB_NAME + quartzJob.getId()).build();//执行定时任务
// scheduler.scheduleJob(jobDetail, cronTrigger);/** 该处仅供参考 */private final static ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll();@Override@SuppressWarnings("unchecked")protected void executeInternal(JobExecutionContext context) {//(1)当Scheduler调用一个Job,就会将JobExecutionContext传递给job的execute方法// quartz无法调用job的有参构造函数,所以创建job的实例的时候是运用反射机制,通过newInstance创建实例,// 并且通过JobDetail描述的name与group属性然后给Job设置一些属性。////(2)Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。QuartzJob quartzJob = (QuartzJob) context.getMergedJobDataMap().get(QuartzJob.JOB_KEY);// 获取spring beanQuartzLogService quartzLogService = SpringContextHolder.getBean(QuartzLogService.class);QuartzJobService quartzJobService = SpringContextHolder.getBean(QuartzJobService.class);QuartzLog log = new QuartzLog();long startTime = System.currentTimeMillis();try {// 执行任务 QuartzRunnable task = new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(),quartzJob.getParams());//这句话中执行了该线程Future<?> future = EXECUTOR.submit(task);future.get();long times = System.currentTimeMillis() - startTime; } catch (Exception e) {logger.error("任务执行失败,任务名称:{}" + quartzJob.getJobName(), e);long times = System.currentTimeMillis() - startTime;log.setTime(times);log.setExceptionDetail(ThrowableUtil.getStackTrace(e));quartzJob.setIsPause(false);//更新状态quartzJobService.updateIsPause(quartzJob);} finally {quartzLogService.save(log);}}
}
ApplicationContextAware接口的拓展和使用相关推荐
- ApplicationContextAware 接口
一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...
- Spring之ApplicationContextAware接口详解
在Spring中,当一个bean实现了ApplicationContextAware接口,这个bean便可以获取到ApplicationContext对象,进而获取应用上下文中的bean. 代码实例 ...
- ApplicationContextAware接口的作用
前言 在我们开发Spring项目时,不管是使用别人的开源框架,还是使用自己公司框架,或者是自己搭建框架的时候,会见到ApplicationContextAware这个接口,可能最常见的是如下代码 pu ...
- java拓展接口_Java拓展接口-default关键词
Java接口在使用过程中有两点规定: 1.接口中只能有定义方法名.方法返回类型,不能有方法的实现. 2.实现接口的类,必须实现接口中所有的方法. 例如下面的例子: //定义接口 public inte ...
- type-c接口PD HUB快充拓展坞方案
如今type-c接口可以说是随处可见,不管是手机,笔记本电脑,平板,还是智能家电,音响,耳机等等,可以说是渗透到了生活的方方面面. 先说说type-c接口的由来:USB-IF组织在2015年推出了US ...
- Android硬件扩展接口有哪些,一种安卓智能设备USB接口拓展的方法及装置与流程...
本发明涉及安卓智能设备技术领域,特别是涉及一种安卓智能设备USB接口拓展的方法及装置. 背景技术: 安卓是一种以Linux为基础的开放源码操作系统,2007年正式推出后,在短短几年时间内得到了广泛的应 ...
- 获取Java接口的所有实现类
获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...
- 计算机硬盘有usb借口吗,为什么移动硬盘不建议插在台式机前置USB接口上
为什么移动硬盘不建议插在台式机前置USB接口上?移动硬盘不建议插在台式电脑前置的USB接口上,主要是因为前置USB接口供电不稳定,有可能会损坏移动硬盘. 在探讨这个问题前,我们先了解一下移动硬盘的工作 ...
- 通过ApplicationContextAware加载Spring上下文环境
项目用到了ApplicationContextAware,通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContex ...
最新文章
- 只能在执行 Render() 的过程中调用 RegisterForEventValidation
- 软件测试基础知识——适合初学者
- 滑动验证码、文件上传、form、AJAX.....
- FD33里面的销售值不正确应该怎么办?
- 王荣刚:视频画质评定是个“大坑”
- python linux 时间格式化,Python3 格式化日期
- 19什么情况下会帮助他人
- java基础—方法重载(overload)
- WordPress 主题教程:从零开始制作 WordPress 主题
- html弹性盒子自适应比例,CCS弹性盒子中间自适应怎么设置
- jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址
- PHP教程,PHP入门教程大全(2021整理)
- 报Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7的错误
- abaqus python教程_Abaqus-python脚本到底应该怎么写?一文带你入门
- 泊松分布的特征与应用(概统2.应用)
- 如何添加PR视频特效?
- Object Classification Using CNN-Based Fusion of Vision and LIDAR in Autonomous Vehicle Environment
- “感动阿里”的技术小二刘畅:善良的事情,我身边很多人都在做
- 反步法设计步骤及仿真验证(非线性系统)
- springcloud(一)微服务概述
热门文章
- mysql调用函数可以打断点吗_糖尿病人可以吃杂粮粥吗?不用纠结,注意2点即可...
- ubuntu进入linux系统安装程序,Ubuntu Linux下安装软件方法
- Java 蜡烛图_ta-lib 里的蜡烛图形态函数源码
- php补充 扩展,php补充安装扩展支持
- java hql多条件查询_Hibernate结合JPA编写通用泛型多条件查询
- Java的内存分配策略有哪些_Java的内存分配策略
- arcengine 加载地图不显示_用LSV下载城市地图、全省地图教程
- python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理
- java专业日报800字,JAVA每日学习日报 7.8
- Django项目知识点(五)