亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring AOP如何在注解上使用SPEL表達式注入對象

 更新時間:2022年02月17日 14:37:59   作者:低脂肪  
這篇文章主要介紹了Spring AOP如何在注解上使用SPEL表達式注入對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在注解上使用SPEL表達式注入對象

場景描述

在平時開發(fā)中,我們經(jīng)常通過定義一些注解,進行輕量級開發(fā)。

今天主要研究的內(nèi)容是關(guān)于如何在注解上通過spel表達式注入對象,以此調(diào)用注入對象的具體業(yè)務(wù)處理邏輯,然后在通過對表達式的解析,進而獲取該業(yè)務(wù)邏輯處理的結(jié)果,類似于Spring Security中的@PreAuthorize, @PreAuthorize, @PostAuthorize等注解,本次場景案例以模仿@PreAuthorize注解進行分析。

具體案例

定義@SpelPreAuthorize注解,對標@PreAuthorize

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SpelPreAuthorize {
? ? String value() default "";
}

定義具體業(yè)務(wù)邏輯處理類

import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component("ps")
public class PermissionService { ? ?
? ? public boolean hasPermission(String permission) {
? ? ? ? List<String> allPermissions = Arrays.asList("user:save", "user:delete", "user:edit");
? ? ? ? return allPermissions.contains(permission);
? ? } ? ??
}

定義切面

  • 通過@Before注解定義前置切面
  • 通過注入spelExpressionParser解析器,用于解析spel表達式
  • 實例化EvaluationContext對象(默認實現(xiàn)tandardEvaluationContext),解析表達式,注入上下文信息,執(zhí)行具體業(yè)務(wù)
import com.czf.ebao.data.spel.annoation.SpelPreAuthorize;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.expression.BeanFactoryResolver;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class SpelPreAuthorizeAspect {
? ? /**
? ? ?* 注入spring bean 工廠
? ? ?*/
? ? @Autowired
? ? private DefaultListableBeanFactory defaultListableBeanFactory;
? ? @Before("@annotation(spelPreAuthorize)")
? ? public void perAuthorize(JoinPoint point, SpelPreAuthorize spelPreAuthorize) {
? ? ? ? String permission = spelPreAuthorize.value();
? ? ? ? // 實例化spel表達式解析器
? ? ? ? SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
? ? ? ? // 解析表達式內(nèi)容
? ? ? ? Expression expression = spelExpressionParser.parseExpression(permission);
? ? ? ? // 聲明StandardEvaluationContext對象,用于設(shè)置上下文對象。
? ? ? ? StandardEvaluationContext context = new StandardEvaluationContext();
? ? ? ? context.setBeanResolver(new BeanFactoryResolver(defaultListableBeanFactory));
? ? ? ? Boolean result = expression.getValue(context, Boolean.class);
? ? ? ? if (!result) {
? ? ? ? ? ? throw new RuntimeException("該用戶無訪問權(quán)限");
? ? ? ? }
? ? }
}

定義測試類

import com.czf.ebao.data.spel.annoation.SpelPreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/spel")
public class SpelController {
? ??
? ? @GetMapping("/hello")
? ? @SpelPreAuthorize("@pms.hasPermission('user:hello')")
? ? public String sayHello() {
? ? ? ? return "hello";
? ? }
}

補充

通配符匹配

// import org.springframework.util.PatternMatchUtils
List<String> allPermissions = Arrays.asList("user:save", "user:delete", "user:edit");
return allPermissions.stream().anyMatch(item -> PatternMatchUtils.simpleMatch(permission, item));

Spring屬性注入方式之SPEL表達式

<bean id="categroy" class="com.test.inject.Category" p:cateName="服裝"></bean>
<bean id="calculate" class="com.test.inject.PriceCalculate"></bean>
<bean id="product" class="com.test.inject.Product" p:name="A21的T恤" p:categroy-ref="categroy">
  <property name="price" value="#{calculate.calPrice()}"></property>
</bean>

spel表達式的好處就是,我們可以使用定義好的某個類中的方法來產(chǎn)生值,然后注入給所需要的對象使用

比較適用于比較復(fù)雜的bean注入

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    這篇文章主要介紹了spring中@Autowire和@Resource的區(qū)別在哪里?本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 基于RabbitMQ幾種Exchange 模式詳解

    基于RabbitMQ幾種Exchange 模式詳解

    下面小編就為大家?guī)硪黄赗abbitMQ幾種Exchange 模式詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • java根據(jù)圖片中綠色像素點的多少進行排序

    java根據(jù)圖片中綠色像素點的多少進行排序

    這篇文章主要介紹了java根據(jù)圖片中綠色像素點的多少進行排序,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • springboot整合flowable框架入門步驟

    springboot整合flowable框架入門步驟

    最近工作中有用到工作流的開發(fā),引入了flowable工作流框架,在此記錄一下springboot整合flowable工作流框架的過程,感興趣的朋友一起看看吧
    2022-04-04
  • SpringBoot集成redis的示例代碼

    SpringBoot集成redis的示例代碼

    redis想必小伙伴們即使沒有用過,也是經(jīng)常聽到的,在工作中,redis用到的頻率非常高,本文主要介紹了SpringBoot集成redis,感興趣的可以參考一下
    2021-10-10
  • java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片

    java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片

    這篇文章主要為大家詳細介紹了java實現(xiàn)圖片轉(zhuǎn)base64字符串,java實現(xiàn)base64字符串轉(zhuǎn)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析

    springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析

    這篇文章主要介紹了springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 關(guān)于intellij idea打開就閃退或關(guān)閉詳細解決辦法

    關(guān)于intellij idea打開就閃退或關(guān)閉詳細解決辦法

    這篇文章主要介紹了關(guān)于intellij idea打開就閃退或關(guān)閉詳細解決辦法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • java編寫ftp下載工具

    java編寫ftp下載工具

    本文給大家介紹的是如何一步步實現(xiàn)使用java編寫FTP下載工具,而且是在Linux環(huán)境下使用javac編譯的,在運行和編譯上有些不同之處,有需要的小伙伴們參考下吧。
    2015-03-03
  • Springboot中的@ConditionalOnBean注解詳細解讀

    Springboot中的@ConditionalOnBean注解詳細解讀

    這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細解讀,@ConditionalOnMissingBean注解兩個類,一個Computer類,一個配置類,想要完成;如果容器中沒有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下
    2023-11-11

最新評論