在我们的实际开发中可能存在这么一种情况,当方法参数中的某些条件成立的时候,需要执行一些逻辑处理,比如输出日志。而这些代码可能都是差不多的,那么这个时候就可以结合自定义注解加上切面加上spel表达式进行处理。就比如在spring中我们可以使用@Cacheable(key="#xx")实现缓存,这个#xx就是一个spel表达式。
需求:我们需要将service层方法中方法的某个参数的值大于0.5的方法,输出方法执行日志。(需要了解一些spel表达式的语法)
实现步骤:
1、自定义一个注解Log
2、自定义一个切面,拦截所有方法上存在@Log注解修饰的方法
3、写一个service层方法,方法上标注@Log注解
难点:
在切面中需要拿到具体执行方法的方法名,可以使用spring提供的LocalVariableTableParameterNameDiscoverer来获取到
一、自定义一个注解
注意:注解中的spel的值是必须的,且spel表达式返回的结果应该是一个布尔值
/** * 记录日志信息,当spel表但是中的值为true时,输出日志信息 * * @描述 * @作者 huan * @时间 2017年10月2日 - 上午10:25:39 */ @Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface Log { String spel(); String desc() default "描述"; }
二、自定义一个service类,在需要拦截的方法上加上@Log注解
三、写一个自定义切面
注意一下解析spel表达式中context的设值即可
/** * 日志切面,当条件满足时输出日志. * * @描述 * @作者 huan * @时间 2017年10月2日 - 上午10:32:16 */ @Component @Aspect public class LogAspect { ExpressionParser parser = new SpelExpressionParser(); LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer(); @Around("@annotation(log)") public Object invoked(ProceedingJoinPoint pjp, Log log) throws Throwable { Object[] args = pjp.getArgs(); Method method = ((MethodSignature) pjp.getSignature()).getMethod(); String spel = log.spel(); String[] params = discoverer.getParameterNames(method); EvaluationContext context = new StandardEvaluationContext(); for (int len = 0; len < params.length; len++) { context.setVariable(params[len], args[len]); } Expression expression = parser.parseExpression(spel); if (expression.getValue(context, Boolean.class)) { System.out.println(log.desc() + ",在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "执行方法," + pjp.getTarget().getClass() + "." + method.getName() + "(" + convertArgs(args) + ")"); } return pjp.proceed(); } private String convertArgs(Object[] args) { StringBuilder builder = new StringBuilder(); for (Object arg : args) { if (null == arg) { builder.append("null"); } else { builder.append(arg.toString()); } builder.append(','); } builder.setCharAt(builder.length() - 1, ' '); return builder.toString(); } }
四、pom文件的依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
五、测试。
六、增加内容:
1、当我们想在自己写的spel表达式中调用spring bean 管理的方法时,如何写。spel表达式支持使用 @来引用bean,但是此时需要注入BeanFactory
相关推荐
SpringBoot 自定义注解,属性支持SPEL表达式。介绍了SPEL表达式的解析
spring spEL 表达式详解 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
Spring_SpEl表达式使用用例 只是一个简单的demo,有需要的可以看看
主要介绍了Spring spel表达式使用方法示例,通过一些实例向大家展示了spel表达式的用法,需要的朋友可以了解下。
Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现
用于Spring Cloud Function SPEL表达式注入漏洞测试环境搭建,是编译好的服务端程序,命令号java -jar *.jar运行即可,服务端运行在127.0.0.1:8080端口
今天小编就为大家分享一篇关于Spring组件开发模式支持SPEL表达式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了Spring实战之Bean定义中的SpEL表达式语言支持操作,结合实例形式分析了Bean定义中的SpEL表达式语言操作步骤与实现技巧,需要的朋友可以参考下
一、创建Spring Boot应用 二、SpEL结合@Value注解读取配置文件属性 三、SpEL结合 @Value注解读取系统环境变量 四、配置文件的占位符
主要介绍了如何使用SpEL表达式实现动态分表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
背景SpEL 不仅支持对值进行算术、关系和逻辑运算;SpEL 也支持使用正则表达式,其中对应的关键字为 match。如下示例中即在表达式中使用了正则表达式,表示
ts-spel 解析器评估器
Spring框架是Java开发中广泛使用的一个强大工具,它通过依赖注入和控制反转等核心概念,极大地提高了开发效率和应用的可维护性。...@Value 提供了一种方便的方式来注入简单类型的属性,支持SpEL表达式和外部配置。
Spring Expression Language (SpEL)中文文档。基于Spring4.x。
SSH笔记-Spring表达式语言:SpEL,关于SpEl的字面量、引用 Bean、属性和方法、支持的运算符号
主要介绍了spring表达式语言SpEL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基于spring容器的策略模式第二版本,比起第一版本,添加了如下功能:1、该版本添加了spel表达式,可以使用spel表达式来匹配你的规则。2、添加group的概念,可以对策略进行分组,然后根据分组进行筛选。
基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志 ### 简介 * 使用annotation来标注方法,标记操作内容 * 使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息) * ...
内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观锁、SpEL表达式在SpringData里面的应用...
opt-log基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志简介使用annotation来标注方法,标记操作内容使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息)同一个...