日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ApplicationContextAware接口的拓展和使用

發(fā)布時(shí)間:2024/9/30 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ApplicationContextAware接口的拓展和使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ApplicationContextAware接口只有一個(gè)方法:

public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext applicationContext) throws BeansException; }

此接口的介紹:
不用類似new ClassPathXmlApplicationContext()的方式,從已有的spring上下文取得已實(shí)例化的bean。通過ApplicationContextAware接口進(jìn)行實(shí)現(xiàn)。

當(dāng)一個(gè)類實(shí)現(xiàn)了這個(gè)接口(ApplicationContextAware)之后,這個(gè)類就可以方便獲得ApplicationContext中的所有bean。換句話說,就是這個(gè)類可以直接獲取spring配置文件中,所有有引用到的bean對(duì)象。

官方介紹的翻譯:

接口由希望被其運(yùn)行的ApplicationContext通知的任何對(duì)象實(shí)現(xiàn)。

實(shí)現(xiàn)這個(gè)接口是有意義的,例如,當(dāng)一個(gè)對(duì)象需要訪問一組協(xié)作bean時(shí)。請(qǐng)注意,通過bean引用進(jìn)行配置比僅僅為了bean查找目的實(shí)現(xiàn)此接口更可取。

如果一個(gè)對(duì)象需要訪問文件資源,例如,想要調(diào)用getResource,想要發(fā)布一個(gè)應(yīng)用事件,或者需要訪問MessageSource,這個(gè)接口也可以實(shí)現(xiàn)。然而,最好在這樣一個(gè)特定的場(chǎng)景中實(shí)現(xiàn)更具體的ResourceLoaderAware、ApplicationEventPublisherAware或MessageSourceAware接口。
參數(shù)applicationContext—要被該對(duì)象使用的applicationContext對(duì)象

ApplicationContextAware接口的作用

實(shí)現(xiàn)**ApplicationContextAware**接口。重寫或繼承里面的方法。
主要可以實(shí)現(xiàn)的功能:

  • 根據(jù)byType獲取byName獲取Bean對(duì)象;
  • 根據(jù)byName判斷Bean對(duì)象是否存在;
  • 根據(jù)bean對(duì)象的name獲取type;
  • 根據(jù)bean對(duì)象的type獲取names;
  • 需要注意的是,需要將這個(gè)類放入Spring容器中管理。即使用**@Component**注解。

    需要注意的是:name不是Bean對(duì)象的全限定名,而是Spring容器中的Bean名。

    實(shí)現(xiàn)setApplicationContext此方法的類:

    使用實(shí)例

    @Slf4j public class SpringContextHolder implements ApplicationContextAware, DisposableBean { //DisposableBean :由希望在銷毀時(shí)釋放資源的bean實(shí)現(xiàn)的接口。 // BeanFactory將在對(duì)作用域bean的單獨(dú)銷毀時(shí)調(diào)用destroy方法。 // applicationcontext應(yīng)該在關(guān)閉時(shí)釋放它的所有單例對(duì)象,這是由應(yīng)用生命周期驅(qū)動(dòng)的。 //出于同樣的目的,spring管理的bean也可以實(shí)現(xiàn)Java的AutoCloseable接口。 // 實(shí)現(xiàn)接口的另一種方法是指定自定義destroy方法,例如在XML bean定義中。private static ApplicationContext applicationContext = null;/*** 從靜態(tài)變量applicationContext中取得Bean, 自動(dòng)轉(zhuǎn)型為所賦值對(duì)象的類型.*/@SuppressWarnings("unchecked")public static <T> T getBean(String name) {assertContextInjected();return (T) applicationContext.getBean(name);}/*** 從靜態(tài)變量applicationContext中取得Bean, 自動(dòng)轉(zhuǎn)型為所賦值對(duì)象的類型.*/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屬性未注入, 請(qǐng)?jiān)赼pplicationContext" +".xml中定義SpringContextHolder或在SpringBoot啟動(dòng)類中注冊(cè)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;} }

    使用這個(gè)上面類在線程對(duì)象中得到目標(biāo)對(duì)象的方法,利用反射進(jìn)行調(diào)用:

    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):
    對(duì)目標(biāo)object執(zhí)行方法method,參數(shù)為params

    調(diào)用反射的方法:

    @Async public class ExecutionJob extends QuartzJobBean { //在QuartManage類中 JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class). // withIdentity(JOB_NAME + quartzJob.getId()).build();//執(zhí)行定時(shí)任務(wù) // scheduler.scheduleJob(jobDetail, cronTrigger);/** 該處僅供參考 */private final static ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll();@Override@SuppressWarnings("unchecked")protected void executeInternal(JobExecutionContext context) {//(1)當(dāng)Scheduler調(diào)用一個(gè)Job,就會(huì)將JobExecutionContext傳遞給job的execute方法//  quartz無法調(diào)用job的有參構(gòu)造函數(shù),所以創(chuàng)建job的實(shí)例的時(shí)候是運(yùn)用反射機(jī)制,通過newInstance創(chuàng)建實(shí)例,// 并且通過JobDetail描述的name與group屬性然后給Job設(shè)置一些屬性。////(2)Job能通過JobExecutionContext對(duì)象訪問到Quartz運(yùn)行時(shí)候的環(huán)境以及Job本身的明細(xì)數(shù)據(jù)。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 {// 執(zhí)行任務(wù) QuartzRunnable task = new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(),quartzJob.getParams());//這句話中執(zhí)行了該線程Future<?> future = EXECUTOR.submit(task);future.get();long times = System.currentTimeMillis() - startTime; } catch (Exception e) {logger.error("任務(wù)執(zhí)行失敗,任務(wù)名稱:{}" + quartzJob.getJobName(), e);long times = System.currentTimeMillis() - startTime;log.setTime(times);log.setExceptionDetail(ThrowableUtil.getStackTrace(e));quartzJob.setIsPause(false);//更新狀態(tài)quartzJobService.updateIsPause(quartzJob);} finally {quartzLogService.save(log);}} }

    總結(jié)

    以上是生活随笔為你收集整理的ApplicationContextAware接口的拓展和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。