亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

Spring組件開發(fā)模式支持SPEL表達(dá)式

2024-07-14 08:43:19
字體:
供稿:網(wǎng)友

本文是一個(gè) Spring 擴(kuò)展支持 SPEL 的簡單模式,方便第三方通過 Spring 提供額外功能。

簡化版方式

這種方式可以在任何能獲取ApplicationContext 的地方使用。還可以提取一個(gè)方法處理動(dòng)態(tài) SPEL 表達(dá)式。

import org.springframework.aop.support.AopUtils;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.*;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.expression.StandardBeanExpressionResolver;import org.springframework.core.annotation.AnnotationUtils;import java.lang.reflect.Method;/** * 針對 Spring 實(shí)現(xiàn)某些特殊邏輯時(shí),支持 SPEL 表達(dá)式 * @author liuzh */public class SpelUtil implements ApplicationContextAware {  /**   * 通過 ApplicationContext 處理時(shí)   * @param applicationContext   * @throws BeansException   */  @Override  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    if (applicationContext instanceof ConfigurableApplicationContext) {      ConfigurableApplicationContext context = (ConfigurableApplicationContext)applicationContext;      ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();      StandardBeanExpressionResolver expressionResolver = new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader());      for (String definitionName : applicationContext.getBeanDefinitionNames()) {        BeanDefinition definition = beanFactory.getBeanDefinition(definitionName);        Scope scope = (definition != null ? beanFactory.getRegisteredScope(definition.getScope()) : null);        //根據(jù)自己邏輯處理        //例如獲取 bean        Object bean = applicationContext.getBean(definitionName);        //獲取實(shí)際類型        Class<?> targetClass = AopUtils.getTargetClass(bean);        //獲取所有方法        for (Method method : targetClass.getDeclaredMethods()) {          //獲取自定義的注解(Bean是個(gè)例子)          Bean annotation = AnnotationUtils.findAnnotation(method, Bean.class);          //假設(shè)下面的 value 支持 SPEL          for (String val : annotation.value()) {            //解析 ${} 方式的值            val = beanFactory.resolveEmbeddedValue(val);            //解析 SPEL 表達(dá)式            Object value = expressionResolver.evaluate(val, new BeanExpressionContext(beanFactory, scope));            //TODO 其他邏輯          }        }      }    }  }}

上面是完全針對ApplicationContext的,下面是更推薦的一種用法。

推薦方式

import org.springframework.aop.support.AopUtils;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanClassLoaderAware;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.config.*;import org.springframework.context.annotation.Bean;import org.springframework.context.expression.StandardBeanExpressionResolver;import org.springframework.core.annotation.AnnotationUtils;import org.springframework.util.ReflectionUtils;/** * 針對 Spring 實(shí)現(xiàn)某些特殊邏輯時(shí),支持 SPEL 表達(dá)式 * @author liuzh */public class SpelUtil2 implements BeanPostProcessor, BeanFactoryAware, BeanClassLoaderAware {  private BeanFactory beanFactory;  private BeanExpressionResolver resolver;  private BeanExpressionContext expressionContext;  /**   * 解析 SPEL   * @param value   * @return   */  private Object resolveExpression(String value){    String resolvedValue = resolve(value);    if (!(resolvedValue.startsWith("#{") && value.endsWith("}"))) {      return resolvedValue;    }    return this.resolver.evaluate(resolvedValue, this.expressionContext);  }  /**   * 解析 ${}   * @param value   * @return   */  private String resolve(String value){    if (this.beanFactory != null && this.beanFactory instanceof ConfigurableBeanFactory) {      return ((ConfigurableBeanFactory) this.beanFactory).resolveEmbeddedValue(value);    }    return value;  }  @Override  public void setBeanClassLoader(ClassLoader classLoader) {    this.resolver = new StandardBeanExpressionResolver(classLoader);  }  @Override  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {    this.beanFactory = beanFactory;    if(beanFactory instanceof ConfigurableListableBeanFactory){      this.resolver = ((ConfigurableListableBeanFactory) beanFactory).getBeanExpressionResolver();      this.expressionContext = new BeanExpressionContext((ConfigurableListableBeanFactory) beanFactory, null);    }  }  @Override  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {    return bean;  }  /**   * 對 bean 的后置處理   * @param bean   * @param beanName   * @return   * @throws BeansException   */  @Override  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {    //獲取實(shí)際類型    Class<?> targetClass = AopUtils.getTargetClass(bean);    //獲取所有方法    ReflectionUtils.doWithMethods(targetClass, method -> {      //獲取自定義的注解(Bean是個(gè)例子)      Bean annotation = AnnotationUtils.findAnnotation(method, Bean.class);      //假設(shè)下面的 value 支持 SPEL      for (String val : annotation.value()) {        //解析表達(dá)式        Object value = resolveExpression(val);        //TODO 其他邏輯      }    }, method -> {      //TODO 過濾方法      return true;    });    return null;  }}

這種方式利用了 Spring 生命周期的幾個(gè)接口來獲取需要用到的對象。

Spring 生命周期調(diào)用順序

擴(kuò)展 Spring 我們必須了解這個(gè)順序,否則就沒法正確的使用各中對象。

完整的初始化方法及其標(biāo)準(zhǔn)順序是:

  • BeanNameAware 的 setBeanName 方法
  • BeanClassLoaderAware 的 setBeanClassLoader 方法
  • BeanFactoryAware 的 setBeanFactory 方法
  • EnvironmentAware 的 setEnvironment 方法
  • EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法
  • ResourceLoaderAware 的 setResourceLoader 方法 (僅在應(yīng)用程序上下文中運(yùn)行時(shí)適用)
  • ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法 (僅在應(yīng)用程序上下文中運(yùn)行時(shí)適用)
  • MessageSourceAware 的 setMessageSource 方法 (僅在應(yīng)用程序上下文中運(yùn)行時(shí)適用)
  • ApplicationContextAware 的 setApplicationContext 方法 (僅在應(yīng)用程序上下文中運(yùn)行時(shí)適用)
  • ServletContextAware 的 setServletContext 方法 (僅在Web應(yīng)用程序上下文中運(yùn)行時(shí)適用)
  • BeanPostProcessors 的 postProcessBeforeInitialization 方法
  • InitializingBean 的 afterPropertiesSet 方法
  • 自定義初始化方法
  • BeanPostProcessors 的 postProcessAfterInitialization 方法

關(guān)閉bean工廠時(shí),以下生命周期方法適用:

  • DestructionAwareBeanPostProcessors 的 postProcessBeforeDestruction 方法
  • DisposableBean 的 destroy 方法
  • 自定義銷毀方法

參考:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html

靈活運(yùn)用

利用上述模式可以實(shí)現(xiàn)很多便捷的操作。

Spring 中,使用類似模式的地方有:

  • @Value 注解支持 SPEL(和 ${})
  • @Cache 相關(guān)的注解(支持 SPEL)
  • @EventListener 注解
  • @RabbitListener 注解

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人福利一区二区| 中文字幕乱码在线人视频| 在线精品视频一区二区| 久久久精品在线观看| 国产麻豆xxxvideo实拍| 欧美男男gaygay1069| 亚洲国模精品私拍| 欧美日韩 国产精品| 91插插插插插插| 欧美人与z0zoxxxx视频| 亚洲精品一卡二卡三卡四卡| 欧美99久久| 免费在线观看麻豆视频| 欧美国产综合色视频| 亚洲网站在线看| 一区二区三区精品牛牛| 国产精品一区二区三区在线免费观看| 国模吧精品视频| 成人在线视频免费| 国产三级三级在线观看| 国产精品丝袜91| 日本在线高清视频一区| 精品国产一区二区三区久久久| 蜜桃精品在线| 中文字幕精品久久久久| 国产一区在线免费观看| 国产香蕉在线| 免费在线一区二区| 久久免费精品视频在这里| 日韩精品一区二区三区视频在线观看| 1卡2卡3卡精品视频| 国产98色在线|日韩| 黄色亚洲在线| 色吊丝一区二区| 日韩区在线观看| 国产精品久久久久秋霞鲁丝| 欧美亚洲不卡| 日韩专区在线| 理论片在线观看理伦片| 你懂得视频在线观看| 国产性70yerg老太| 美女福利视频一区| 日本一卡二卡在线播放| 成人av福利| 欧美孕妇与黑人孕交| 亚洲成人av| 国产欧美一区二区三区在线老狼| 黑人巨大精品欧美黑白配亚洲| 久久超碰97人人做人人爱| 国产男男gay网站| 久久精品三级| 国产精品啊啊啊| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 精品视频高清无人区区二区三区| 国产精品美女久久福利网站| 国产精品三p一区二区| 国产网址在线观看| 国产www免费观看| 国产精品夜间视频香蕉| 亚洲xxxxx| 中国毛片在线观看| 影音先锋资源av| 亚洲精品成人免费| 欧美另类极品videosbest视| 欧美一区二区三区在线观看免费| 天堂网在线观看国产精品| 在线观看视频亚洲| 亚洲一区二区图片| 不卡av影片| 日本免费资源| 亚洲片在线观看| 日本久久天堂| 国产成人av自拍| 精品一区二区三区在线观看国产| 可以在线看黄的网站| 日韩免费三级| 一级片在线免费看| 99国产精品久久久久久久| 精品国产一区二区三区av性色| 国产91国语对白在线| 美女视频黄频大全不卡视频在线播放| 四虎4hu永久免费入口| 国产无遮挡又黄又爽在线观看| 亚洲人成人一区二区三区| 国产乱码字幕精品高清av| 在线观看成年人网站| 亚洲精品综合一区二区三区| 天天做天天爱天天综合网2021| 精品视频1区2区| 97午夜影院| а√天堂在线官网| 日本在线视频免费观看| 亚洲在线观看视频网站| 老司机午夜免费福利视频| 男人的天堂av高清在线| 九九热这里有精品| 黄色大片在线免费看| 欧美人与禽猛交乱配视频| 这里只有精品国产| 成人在线丰满少妇av| 91亚洲精品丁香在线观看| 久久国产精品视频在线观看| 欧美一级精品大片| 99久热re在线精彩视频| 五月婷婷综合在线| www.99久久热国产日韩欧美.com| 免费看啪啪网站| 91精品国产综合久久精品| 99久久久无码国产精品| 69堂成人精品视频免费| 动漫视频在线一区| 99tv成人影院| 色www精品视频在线观看| 欧美精品一区二区高清在线观看| 欧美国产激情一区二区三区蜜月| 邪恶网站在线观看| 狠狠干夜夜草| 久久久久久久久久av| 国产午夜精品久久久| 国产精品吹潮在线观看| 精品国产乱子伦一区| 妺妺窝人体色www在线观看| 亚洲国产一区二区久久| 天堂va蜜桃一区二区三区| 亚洲a成v人在线观看| 国产后入清纯学生妹| 三妻四妾的电影电视剧在线观看| 午夜免费一区二区| 综合婷婷亚洲小说| 欧美—级在线免费片| 欧美少妇在线观看| 国产一级二级三级在线观看| 久久在线免费观看视频| 国产一区二区福利| 久久蜜桃一区二区| 超碰97人人在线| 亚洲欧美日韩国产中文| 国产精品99久久免费观看| 日韩久久精品一区二区三区| 日本视频一区二区不卡| 国产成人综合网站| 国产精品久久久久久在线| 先锋影音国产精品| jizzjizz在线| 韩国精品美女www爽爽爽视频| 欧美日韩国产一区二区| 中文字幕一二三区在线观看| wwww在线观看免费视频| 国产一二三四区在线观看| 女人天堂亚洲aⅴ在线观看| 激情黄产视频在线免费观看| 高清不卡在线观看| 欧美一区1区三区3区公司| 国产精品久久夜| 国产熟女高潮视频| 日韩国产欧美精品| 中国一级特黄录像播放| 久久精品免费一区二区三区| 亚洲欧美久久婷婷爱综合一区天堂| 国产精品一二三四| 9l视频白拍9色9l视频| 中文字字幕在线中文乱码| 蜜臀国产一区二区三区在线播放| 精品一区二区三区四区在线| 日本人妻伦在线中文字幕| 综合在线影院| 天堂成人娱乐在线视频免费播放网站| 黄页网站大全一区二区| 51午夜精品| 欧美套图亚洲一区| 在线视频精品免费| 亚洲最大福利网站| 婷婷伊人综合中文字幕| 一区二区三区四区精品| 婷婷亚洲五月| 依依成人综合网| 91免费观看网站| 亚洲视频www| 国产美女高潮视频| 欧美性大战久久| 天天色天天色| 四虎永久在线精品免费一区二区| 久久中文字幕一区二区| 国产网红在线| 日本欧美大码aⅴ在线播放| 亚洲欧洲在线观看| 青娱乐精品在线视频| 日本在线影院| 精品国产乱码久久久久久夜甘婷婷| 国产大学生自拍视频| 99综合99| 国产日韩在线免费| 怡红院精品视频| 天堂久久午夜av| 韩日精品一区| 色成人亚洲网| 欧美精品一区视频| 一区二区三区福利| 国产传媒国产传媒| 精品黑人一区二区三区国语馆| 9l视频自拍蝌蚪9l视频| 日本黄色免费网站| 欧洲毛片视频| 亚洲欧美一区二区在线观看| 久久精品福利| 国产三级精品三级在线| 精品视频在线播放| 91污色多多| 精品乱子伦一区二区三区| 97在线免费| 成人在线高清免费| h视频在线网站| 桃色av一区二区| 久久精品午夜一区二区福利| 欧美高清在线视频观看不卡| 色综合视频二区偷拍在线| 国产欧美日本一区视频| 美女露出粉嫩尿囗让男人桶| 亚洲人体视频| 国产福利91精品一区二区三区| 在线看无码的免费网站| 成人在线免费网站| 日本一区二区在线观看视频| 360天大佬第二季在线观看| 日本在线视频一区| 欧美成在线视频| 国产激情无套内精对白视频| 久久久久久高清| 中文字幕一区日韩精品欧美| 妞干网这里只有精品| 国产大陆a不卡| 肉丝美足丝袜一区二区三区四| 国产女人高潮时对白| 久久精品二区亚洲w码| 日本欧美爱爱爱| 欧美另类极品videosbest视| 日本中文字幕在线2020| www.日韩视频| 欧美日韩日本视频| 日本在线中文字幕一区| 潘金莲一级黄色片| 国产精品免费无遮挡无码永久视频| 中文字幕丰满乱子伦无码专区| 黄色精品免费| 亚洲精品中文字幕在线播放| 欧美日韩一级二级| 精品视频一二三| 久久国际精品| 68国产成人综合久久精品| 国产精品一色哟哟哟| 精品1区2区3区| 亚洲欧美另类久久久精品| 日韩激情一区| 免费av网站在线看| 欧美精品第一页在线播放| 亚洲乱码国产乱码精品精软件| 欧美精品一区二区三区涩爱蜜| 最新国产精品| 亚洲精品一线| 韩日在线播放| 成人手机在线播放| www黄视频| 中文字幕日本最新乱码视频| 9.1人成人免费视频网站| 国产成人夜间影院在线观看| 久久综合九色综合欧美狠狠| av观看成片免费网站| 884aa四虎免费影库4h| 亚洲一区二区欧美| 男男做爰猛烈叫床爽爽小说| 久久93精品国产91久久综合| 忘忧草在线www成人影院| 日本天码aⅴ片在线电影网站| 久久久久久久欧美精品| 色偷偷av男人的天堂| 日韩簧片在线观看| 国产精品9999久久久久仙踪林| 91浏览器在线视频| 国产精品嫩草影院com| 又爽又大又黄a级毛片在线视频| 日韩欧美在线免费观看| 亚洲免费一在线| 午夜日韩在线| 国产午夜精品美女视频明星a级| 男女无套免费视频网站动漫| 福利视频网址导航| 国产一卡二卡3卡4卡四卡在线| 精品免费久久久久久久| 亚洲欧洲免费无码| a黄色片在线观看| 亚洲电影激情视频网站| 日韩一区日韩二区| 亚洲桃色综合影院| 欧美国产美女| 中国黄色片免费看| 国产精品亚洲成在人线| 美洲精品一卡2卡三卡4卡四卡| 精品手机在线视频| 99精品视频免费观看| 在线观看精品视频看看播放| 国内自拍欧美| www夜片内射视频日韩精品成人| 欧美精品momsxxx| 精品久久久久久久久久久久久久久久久| 免费av一区二区三区四区| 男女交配网站| 亚洲欧美日韩成人网| 东方欧美亚洲色图在线| 天天躁日日躁狠狠躁欧美| jk漫画禁漫成人入口| 国产aⅴ夜夜欢一区二区三区| 99精品国产99久久久久久白柏| 久久综合亚洲色hezyo国产| 国产精品色呦呦| 国产成人免费观看网站| 国产精品久久久久久久牛牛| 久久久亚洲精华液精华液精华液| 欧美高清自拍一区| 欧美午夜精品电影| av动漫在线免费观看| 亚洲天堂成人在线视频| 欧美一级xxx| 精品国产老师黑色丝袜高跟鞋| 嫩草懂你的影院| av大片在线| 无码人妻aⅴ一区二区三区有奶水| 美脚恋feet久草欧美| 男女视频在线观看网站|