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**接口。重写或继承里面的方法。
主要可以实现的功能:

  1. 根据byType获取byName获取Bean对象;
  2. 根据byName判断Bean对象是否存在;
  3. 根据bean对象的name获取type;
  4. 根据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接口的拓展和使用相关推荐

  1. ApplicationContextAware 接口

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  2. Spring之ApplicationContextAware接口详解

    在Spring中,当一个bean实现了ApplicationContextAware接口,这个bean便可以获取到ApplicationContext对象,进而获取应用上下文中的bean. 代码实例 ...

  3. ApplicationContextAware接口的作用

    前言 在我们开发Spring项目时,不管是使用别人的开源框架,还是使用自己公司框架,或者是自己搭建框架的时候,会见到ApplicationContextAware这个接口,可能最常见的是如下代码 pu ...

  4. java拓展接口_Java拓展接口-default关键词

    Java接口在使用过程中有两点规定: 1.接口中只能有定义方法名.方法返回类型,不能有方法的实现. 2.实现接口的类,必须实现接口中所有的方法. 例如下面的例子: //定义接口 public inte ...

  5. type-c接口PD HUB快充拓展坞方案

    如今type-c接口可以说是随处可见,不管是手机,笔记本电脑,平板,还是智能家电,音响,耳机等等,可以说是渗透到了生活的方方面面. 先说说type-c接口的由来:USB-IF组织在2015年推出了US ...

  6. Android硬件扩展接口有哪些,一种安卓智能设备USB接口拓展的方法及装置与流程...

    本发明涉及安卓智能设备技术领域,特别是涉及一种安卓智能设备USB接口拓展的方法及装置. 背景技术: 安卓是一种以Linux为基础的开放源码操作系统,2007年正式推出后,在短短几年时间内得到了广泛的应 ...

  7. 获取Java接口的所有实现类

    获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...

  8. 计算机硬盘有usb借口吗,为什么移动硬盘不建议插在台式机前置USB接口上

    为什么移动硬盘不建议插在台式机前置USB接口上?移动硬盘不建议插在台式电脑前置的USB接口上,主要是因为前置USB接口供电不稳定,有可能会损坏移动硬盘. 在探讨这个问题前,我们先了解一下移动硬盘的工作 ...

  9. 通过ApplicationContextAware加载Spring上下文环境

    项目用到了ApplicationContextAware,通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContex ...

最新文章

  1. 只能在执行 Render() 的过程中调用 RegisterForEventValidation
  2. 软件测试基础知识——适合初学者
  3. 滑动验证码、文件上传、form、AJAX.....
  4. FD33里面的销售值不正确应该怎么办?
  5. 王荣刚:视频画质评定是个“大坑”
  6. python linux 时间格式化,Python3 格式化日期
  7. 19什么情况下会帮助他人
  8. java基础—方法重载(overload)
  9. WordPress 主题教程:从零开始制作 WordPress 主题
  10. html弹性盒子自适应比例,CCS弹性盒子中间自适应怎么设置
  11. jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址
  12. PHP教程,PHP入门教程大全(2021整理)
  13. 报Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7的错误
  14. abaqus python教程_Abaqus-python脚本到底应该怎么写?一文带你入门
  15. 泊松分布的特征与应用(概统2.应用)
  16. 如何添加PR视频特效?
  17. Object Classification Using CNN-Based Fusion of Vision and LIDAR in Autonomous Vehicle Environment
  18. “感动阿里”的技术小二刘畅:善良的事情,我身边很多人都在做
  19. 反步法设计步骤及仿真验证(非线性系统)
  20. springcloud(一)微服务概述

热门文章

  1. mysql调用函数可以打断点吗_糖尿病人可以吃杂粮粥吗?不用纠结,注意2点即可...
  2. ubuntu进入linux系统安装程序,Ubuntu Linux下安装软件方法
  3. Java 蜡烛图_ta-lib 里的蜡烛图形态函数源码
  4. php补充 扩展,php补充安装扩展支持
  5. java hql多条件查询_Hibernate结合JPA编写通用泛型多条件查询
  6. Java的内存分配策略有哪些_Java的内存分配策略
  7. arcengine 加载地图不显示_用LSV下载城市地图、全省地图教程
  8. python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理
  9. java专业日报800字,JAVA每日学习日报 7.8
  10. Django项目知识点(五)