最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

場景描述

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

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

具體案例

定義@SpelPreAuthorize注解,對標@PreAuthorize

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

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

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è)務
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對象,用于設置上下文對象。
? ? ? ? StandardEvaluationContext context = new StandardEvaluationContext();
? ? ? ? context.setBeanResolver(new BeanFactoryResolver(defaultListableBeanFactory));
? ? ? ? Boolean result = expression.getValue(context, Boolean.class);
? ? ? ? if (!result) {
? ? ? ? ? ? throw new RuntimeException("該用戶無訪問權限");
? ? ? ? }
? ? }
}

定義測試類

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)生值,然后注入給所需要的對象使用

比較適用于比較復雜的bean注入

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

相關文章

  • Java中操作Redis的詳細方法

    Java中操作Redis的詳細方法

    基于Jedis實現(xiàn)對redis中字符串的操作,文中通過實例代碼給大家介紹的非常詳細,包括連接池JedisPool應用的實例代碼,對Java操作Redis的相關知識感興趣的朋友一起看看吧
    2021-11-11
  • Springboot分模塊項目搭建的實現(xiàn)

    Springboot分模塊項目搭建的實現(xiàn)

    在軟件開發(fā)中,利用Spring?Boot進行分模塊項目搭建能夠提高代碼的模塊化和復用性,本文主要介紹了Springboot分模塊項目搭建的實現(xiàn),感興趣的可以了解一下
    2024-10-10
  • Java技能點之SimpleDateFormat進行日期格式化問題

    Java技能點之SimpleDateFormat進行日期格式化問題

    這篇文章主要介紹了Java技能點之SimpleDateFormat進行日期格式化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Kotlin 泛型詳解及簡單實例

    Kotlin 泛型詳解及簡單實例

    這篇文章主要介紹了 Kotlin 泛型詳解及簡單實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • spring中jdbcTemplate.batchUpdate的幾種使用情況

    spring中jdbcTemplate.batchUpdate的幾種使用情況

    本文主要介紹了spring中jdbcTemplate.batchUpdate的幾種使用情況,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • JpaRepository如何實現(xiàn)增刪改查并進行單元測試

    JpaRepository如何實現(xiàn)增刪改查并進行單元測試

    這篇文章主要介紹了JpaRepository如何實現(xiàn)增刪改查并進行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 如何提高java代碼的重用性

    如何提高java代碼的重用性

    在本篇文章中小編給各位分享了關于如何提高java代碼的重用性的相關知識點內(nèi)容,有需要的朋友們參考下。
    2019-07-07
  • Java輸入流Scanner/BufferedReader使用方法示例

    Java輸入流Scanner/BufferedReader使用方法示例

    這篇文章主要介紹了Java輸入流Scanner/BufferedReader使用方法,大家看示例吧
    2013-11-11
  • Java實現(xiàn)公用實體類轉(zhuǎn)Tree結構

    Java實現(xiàn)公用實體類轉(zhuǎn)Tree結構

    這篇文章主要為大家介紹了一個Java工具類,可以實現(xiàn)Java公用實體類轉(zhuǎn)Tree結構,文中的示例代碼簡潔易懂,感興趣的小伙伴可以參考一下
    2024-10-10
  • Mybatis開發(fā)要點-resultType和resultMap有什么區(qū)別詳解

    Mybatis開發(fā)要點-resultType和resultMap有什么區(qū)別詳解

    本文主要介紹了Mybatis開發(fā)要點-resultType和resultMap有什么區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04

最新評論

中方县| 大安市| 二连浩特市| 静宁县| 牟定县| 徐汇区| 汕头市| 青神县| 来凤县| 广平县| 湖南省| 山东省| 洛川县| 库车县| 阳春市| 丹巴县| 九江县| 三门县| 巩义市| 松滋市| 剑川县| 沭阳县| 土默特右旗| 明水县| 潼南县| 莱阳市| 精河县| 合山市| 瑞金市| 克东县| 玛沁县| 贞丰县| 巴马| 千阳县| 宜兴市| 新邵县| 峡江县| 凤山县| 鹰潭市| 云阳县| 洱源县|