国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring組件開發模式支持SPEL表達式

Spring組件開發模式支持SPEL表達式

2021-06-24 10:31isea533 Java教程

今天小編就為大家分享一篇關于Spring組件開發模式支持SPEL表達式,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

本文是一個 spring 擴展支持 spel 的簡單模式,方便第三方通過 spring 提供額外功能。

簡化版方式

這種方式可以在任何能獲取applicationcontext 的地方使用。還可以提取一個方法處理動態 spel 表達式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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 實現某些特殊邏輯時,支持 spel 表達式
 * @author liuzh
 */
public class spelutil implements applicationcontextaware {
  /**
   * 通過 applicationcontext 處理時
   * @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);
        //根據自己邏輯處理
        //例如獲取 bean
        object bean = applicationcontext.getbean(definitionname);
        //獲取實際類型
        class<?> targetclass = aoputils.gettargetclass(bean);
        //獲取所有方法
        for (method method : targetclass.getdeclaredmethods()) {
          //獲取自定義的注解(bean是個例子)
          bean annotation = annotationutils.findannotation(method, bean.class);
          //假設下面的 value 支持 spel
          for (string val : annotation.value()) {
            //解析 ${} 方式的值
            val = beanfactory.resolveembeddedvalue(val);
            //解析 spel 表達式
            object value = expressionresolver.evaluate(val, new beanexpressioncontext(beanfactory, scope));
            //todo 其他邏輯
          }
        }
      }
    }
  }
}

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

推薦方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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 實現某些特殊邏輯時,支持 spel 表達式
 * @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 {
    //獲取實際類型
    class<?> targetclass = aoputils.gettargetclass(bean);
    //獲取所有方法
    reflectionutils.dowithmethods(targetclass, method -> {
      //獲取自定義的注解(bean是個例子)
      bean annotation = annotationutils.findannotation(method, bean.class);
      //假設下面的 value 支持 spel
      for (string val : annotation.value()) {
        //解析表達式
        object value = resolveexpression(val);
        //todo 其他邏輯
      }
    }, method -> {
      //todo 過濾方法
      return true;
    });
    return null;
  }
}

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

spring 生命周期調用順序

擴展 spring 我們必須了解這個順序,否則就沒法正確的使用各中對象。

完整的初始化方法及其標準順序是:

  • beannameaware 的 setbeanname 方法
  • beanclassloaderaware 的 setbeanclassloader 方法
  • beanfactoryaware 的 setbeanfactory 方法
  • environmentaware 的 setenvironment 方法
  • embeddedvalueresolveraware 的 setembeddedvalueresolver 方法
  • resourceloaderaware 的 setresourceloader 方法 (僅在應用程序上下文中運行時適用)
  • applicationeventpublisheraware 的 setapplicationeventpublisher 方法 (僅在應用程序上下文中運行時適用)
  • messagesourceaware 的 setmessagesource 方法 (僅在應用程序上下文中運行時適用)
  • applicationcontextaware 的 setapplicationcontext 方法 (僅在應用程序上下文中運行時適用)
  • servletcontextaware 的 setservletcontext 方法 (僅在web應用程序上下文中運行時適用)
  • beanpostprocessors 的 postprocessbeforeinitialization 方法
  • initializingbean 的 afterpropertiesset 方法
  • 自定義初始化方法
  • beanpostprocessors 的 postprocessafterinitialization 方法

關閉bean工廠時,以下生命周期方法適用:

  • destructionawarebeanpostprocessors 的 postprocessbeforedestruction 方法
  • disposablebean 的 destroy 方法
  • 自定義銷毀方法

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

靈活運用

利用上述模式可以實現很多便捷的操作。

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

  • @value 注解支持 spel(和 ${})
  • @cache 相關的注解(支持 spel)
  • @eventlistener 注解
  • @rabbitlistener 注解

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/isea533/article/details/84100428

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕在线观看日本 | 欧美福利视频 | 日韩激情一区二区 | 日韩在线播放一区二区三区 | 国产亚洲精 | 国产伦精品一区二区三区四区视频_ | 国产精品久久久久久久9999 | 亚洲国产二区 | 国产99久久 | 波多一区二区 | 国产精品午夜电影 | 91麻豆精品国产91久久久更新资源速度超快 | 国产99久久精品 | 国产精品一区二区三区在线播放 | 亚洲人成免费网站 | 亚洲精品久久久一区二区三区 | 久久久国产一区二区三区四区小说 | 精品在线播放 | 午夜tv| 国产欧美日韩一级大片 | 国产精品久久久久久久久久久新郎 | 一二三区视频 | 91资源在线| 日韩不卡二区 | 免费观看一区二区三区 | 毛片在线视频 | 成人在线视频网 | 最近日本韩国高清免费观看 | 成人美女av| av伊人网 | 91在线视频 | 欧美日韩干 | 黄色片子免费观看 | 一区二区乱码 | 久久久精品网站 | 国外精品视频在线观看 | 国产精品一二三区 | 精品一区二区在线观看 | 国产激情偷乱视频一区二区三区 | 亚洲欧洲自拍 | 欧美一区高清 |