网站首页标题怎么写公司网站建设厂家

张小明 2026/1/9 11:26:44
网站首页标题怎么写,公司网站建设厂家,小型企业网站建设的背景,李宁网站开发ppt模板在SpringBoot开发中#xff0c;我们经常会遇到需要动态获取配置、动态调用方法、动态判断条件的场景。而SpEL#xff08;Spring Expression Language#xff0c;Spring表达式语言#xff09;就是Spring提供的一款强大的“动态工具”#xff0c;能帮我们轻松搞定这些需求。…在SpringBoot开发中我们经常会遇到需要动态获取配置、动态调用方法、动态判断条件的场景。而SpELSpring Expression LanguageSpring表达式语言就是Spring提供的一款强大的“动态工具”能帮我们轻松搞定这些需求。很多小伙伴对SpEL的了解还停留在“听过但不会用”的阶段今天这篇文章就从基础到实战把SpEL讲透配合具体代码示例让你看完就能上手一、什么是SpELSpEL是Spring框架自带的表达式语言支持运行时查询和操作对象功能非常强大。它和JSP的EL表达式有点类似但适用范围更广——不仅能在配置文件中使用还能在Java代码、注解中使用。核心作用动态求值。比如动态获取配置项、动态调用Bean的方法、动态访问对象的属性等。举个简单的例子我们想在代码中动态获取application.yml中的配置值用SpEL可以直接写Value(${spring.datasource.url})这就是SpEL最基础的用法之一。二、SpEL基础语法SpEL的表达式以#{}包裹注意和EL表达式的${}区分后者主要用于配置占位符而SpEL可以做更复杂的运算内部支持多种语法1. 字面量表达式直接表示基本数据类型、字符串等简单直观#{100}// 整数#{3.14}// 浮点数#{true}// 布尔值#{HelloSpEL}// 字符串单引号包裹2. 变量引用使用#变量名引用变量常见于代码中或Spring内置变量#root根对象#this当前对象#systemProperties系统属性Spring内置#environment环境变量Spring内置可获取配置文件值示例获取系统属性中的Java版本#{systemProperties[java.version]}3. 运算符表达式支持算术运算、比较运算、逻辑运算、三元运算等和Java语法类似#{1020}// 算术运算30#{10050}// 比较运算true#{truefalse}// 逻辑运算false#{age18?成年:未成年}// 三元运算4. 方法调用可以直接调用对象的方法包括静态方法和实例方法#{Hello.toUpperCase()}// 实例方法HELLO#{Math.abs(-100)}// 静态方法100Math是全类名可省略全类名需配置5. 集合操作支持对List、Map等集合的创建和访问#{[a,b,c]}// 创建List#{{name:张三,age:20}}// 创建Map注意大括号内键值对#{[a,b,c][0]}// 访问List索引a#{{name:张三,age:20}[name]}// 访问Map键张三三、SpringBoot中SpEL的核心用法场景SpEL在SpringBoot中的应用非常广泛最常用的有以下4个场景每个场景都配了可直接运行的代码示例场景1Value注解中动态注入值这是最常用的场景通过Value配合SpEL可动态注入配置值、系统属性、运算结果等替代硬编码。步骤在application.yml中定义配置user:name:李四age:25address:北京-朝阳区max-score:100在Bean中用Value SpEL注入importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;ComponentpublicclassUserConfig{// 1. 注入配置文件中的值结合${}占位符SpEL可嵌套${}Value(#{${user.age}})privateIntegerage;// 2. 注入配置值并做运算Value(#{${user.max-score} * 0.8})// 100 * 0.8 80privateDoublepassScore;// 3. 注入字符串并拼接Value(#{用户姓名 ${user.name}})privateStringuserName;// 4. 注入系统属性Value(#{systemProperties[os.name]})privateStringosName;// 5. 三元运算动态注入Value(#{${user.age} 18 ? 成年用户 : 未成年用户})privateStringuserType;// getter/setter省略}}测试启动项目获取UserConfig Bean打印属性值会发现所有值都被正确注入场景2ConditionalOnExpression条件注解在SpringBoot自动配置中经常用ConditionalOnExpression配合SpEL实现“动态条件装配Bean”——只有当SpEL表达式求值为true时才创建该Bean。示例根据配置文件中的feature.redis.enable值决定是否创建RedisTemplate Beanimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Conditional;importorg.springframework.context.annotation.Configuration;importorg.springframework.boot.autoconfigure.condition.ConditionalOnExpression;importorg.springframework.data.redis.core.RedisTemplate;ConfigurationpublicclassRedisConfig{// 当配置项feature.redis.enable为true时才创建该BeanBeanConditionalOnExpression(#{environment.getProperty(feature.redis.enable) true})publicRedisTemplateString,ObjectredisTemplate(){RedisTemplatelt;String,Objectgt;templatenewRedisTemplate();// 配置RedisTemplate省略连接工厂等配置returntemplate;}}说明environment.getProperty(key)用于获取配置文件中的值表达式结果为true时Bean才会被装配。场景3Spring Security中的权限控制在Spring Security中可通过SpEL动态判断用户权限比如在PreAuthorize注解中使用控制方法的访问权限。示例只有拥有ADMIN角色或用户ID为1的用户才能访问deleteUser方法importorg.springframework.security.access.prepost.PreAuthorize;importorg.springframework.web.bind.annotation.DeleteMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassUserController{// SpEL表达式hasRole(ADMIN)判断角色authentication.principal获取当前用户PreAuthorize(hasRole(ADMIN) or #userId authentication.principal.id)DeleteMapping(/user/{userId})publicStringdeleteUser(PathVariableIntegeruserId){// 删除用户逻辑return删除成功;}}常用的Spring Security SpEL表达式hasRole(角色名)是否拥有指定角色hasAuthority(权限名)是否拥有指定权限authentication当前认证对象principal当前用户对象场景4代码中直接使用SpEL求值除了注解我们还可以在Java代码中直接创建SpEL解析器手动解析表达式灵活处理复杂场景。核心APIExpressionParser表达式解析器常用实现SpelExpressionParserExpression解析后的表达式对象调用getValue()求值EvaluationContext求值上下文用于定义变量、根对象等示例1解析简单表达式importorg.springframework.expression.Expression;importorg.springframework.expression.ExpressionParser;importorg.springframework.expression.spel.standard.SpelExpressionParser;publicclassSpelDemo{publicstaticvoidmain(String[]args){// 1. 创建解析器ExpressionParserparsernewSpelExpressionParser();// 2. 解析表达式求1020*3的结果Expressionexpressionparser.parseExpression(10 20 * 3);// 3. 求值Integerresultexpression.getValue(Integer.class);System.out.println(result);// 输出70}}示例2操作对象属性和方法importorg.springframework.expression.Expression;importorg.springframework.expression.ExpressionParser;importorg.springframework.expression.spel.standard.SpelExpressionParser;importorg.springframework.expression.spel.support.StandardEvaluationContext;// 定义用户类classUser{privateStringname;privateIntegerage;// getter/setter/构造方法省略publicStringgetUserName(){return用户name;}}publicclassSpelObjectDemo{publicstaticvoidmain(String[]args){ExpressionParserparsernewSpelExpressionParser();StandardEvaluationContextcontextnewStandardEvaluationContext();// 1. 定义根对象UserusernewUser(张三,25);context.setRootObject(user);// 2. 解析表达式获取根对象的name属性Expressionexp1parser.parseExpression(name);Stringnameexp1.getValue(context,String.class);System.out.println(name);// 输出张三// 3. 解析表达式调用根对象的getUserName()方法Expressionexp2parser.parseExpression(getUserName());StringuserNameexp2.getValue(context,String.class);System.out.println(userName);// 输出用户张三// 4. 解析表达式给age属性赋值Expressionexp3parser.parseExpression(age 30);exp3.getValue(context);System.out.println(user.getAge());// 输出30}}四、SpEL使用注意事项区分 #{}和${}${}用于配置占位符只能获取配置值不能做运算#{}SpEL表达式支持运算、方法调用等复杂操作嵌套使用如果需要对配置值做运算可以嵌套比如#{${user.age} 5}。避免复杂表达式SpEL虽然强大但如果表达式过于复杂比如多层嵌套、复杂逻辑会降低代码可读性建议复杂逻辑放在Java代码中实现。空指针问题使用SpEL访问对象属性或调用方法时要确保对象不为null否则会抛出空指针异常可通过三元运算规避#{user ! null ? user.name : 默认值}。性能问题频繁创建ExpressionParser会影响性能建议将其定义为单例复用。五、总结SpEL是SpringBoot中的“动态利器”核心用于动态求值常见场景包括Value注解动态注入ConditionalOnExpression条件装配Spring Security权限控制代码中手动解析表达式。掌握SpEL的基础语法和核心场景能让你的代码更灵活、更简洁。建议大家结合文中的示例代码动手实践一下很快就能上手如果这篇文章对你有帮助别忘了点赞、在看、转发三连哦有任何问题欢迎在评论区留言咱们下期再见
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站备案流程及步骤兼职制作网站开发

InfLLM是一种无需再训练的LLMs长上下文处理方法,通过Memory Units和Sliding Window分别建模远距离和局部上下文。它将历史KV Cache分块为memory units,选取代表性tokens,并设计高效的检索和LRU缓存机制,仅加载相关memory units至G…

张小明 2026/1/7 10:46:02 网站建设

关于企业网站建设网页制作培训班前景

微信公众号内容也能喂给Anything-LLM做智能问答? 在信息爆炸的时代,我们每天都在“阅读”,但真正能“记住”和“用上”的却少之又少。尤其是像微信公众号这样充斥着高质量行业分析、技术解读与趋势洞察的内容平台,文章越积越多&am…

张小明 2026/1/7 10:37:21 网站建设

学校网站的功能朋友圈的广告推广怎么弄

PyTorch艺术大师:5分钟学会AI图像风格迁移 【免费下载链接】Paddle Parallel Distributed Deep Learning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署…

张小明 2026/1/9 2:07:27 网站建设

苏州中小型网站建设路飞和女帝做h的网站

中国科学技术大学Beamer模板使用指南 【免费下载链接】ustcbeamer USTC Beamer 模板(基于学校公用 PPT 模板) 项目地址: https://gitcode.com/gh_mirrors/us/ustcbeamer 中国科学技术大学Beamer模板是一款专为学术展示设计的专业工具,…

张小明 2026/1/7 10:40:24 网站建设

看谁做的好舞蹈视频网站html网页设计颜色代码

由于您仅提供了“以下”两个字,没有具体的英文内容,所以我无法按照要求为您生成博客,请您提供完整的英文内容。请您先提供完整的英文内容,这样我才能为您生成符合要求的博客下半部分。目前仅“以下”二字,没有足够信息…

张小明 2026/1/7 13:30:16 网站建设

一个主机 多个网站网站建设张景鹏

PaddlePaddle无人配送车感知系统构建 在城市街头悄然穿行的无人配送车,正从科幻场景变为现实。这些“小个头、大智慧”的移动机器人,需要在复杂的人车混流环境中安全穿行——既要识别出突然冲出的孩童,又要读懂小区门口歪斜的门牌号&#xff…

张小明 2026/1/7 10:37:02 网站建设