本文共 2805 字,大约阅读时间需要 9 分钟。
Spring 表达式语言(SpEL)是 Spring 应用程序的强大功能之一,支持运行时查询和操作对象图。以下是关于 SpEL 的详细介绍:
SpEL 的语法类似于 Java 的 EL(JavaExpressio Language),其中使用 #{…} 作为定界符,括号内的所有字符都被认为是 SpEL 表达式。SpEL 提供了对 Bean 属性的动态赋值能力,是实现 Spring Bean 引用和操作的核心工具。
通过 SpEL,可以实现以下功能:
matches 运算符进行复杂的条件判断。SpEL 表达式可以包含以下类型的字面量:
#{5} 或 #{...}。#{89.7} 或 #{...}。#{1e4} 或 #{...}。#{‘Chuck’} 或 #{‘Chuck’},两种引号都可以使用。#{false} 或 #{true}。@Beanpublic class Car { private String brand; private int maxSpeed; // setter 方法省略}@Beanpublic class Person { private Car car; // setter 方法省略}@Beanpublic class Car { private String brand; private int maxSpeed; public static final int MAX_SPEED = 100; // 静态属性或方法}使用 SpEL 引用:
SpEL 支持多种运算符,包括算术运算符、比较运算符、逻辑运算符等。以下是一些常用的运算符示例:
算术运算符:
+、-、*、/、%、^(指数运算)+ 还可以用于字符串连接。#{car.price > 50 ? '高' : '低'}比较运算符:
==、!=、>=、<=、&&、||、! 等。#{'a' >= 'c' ? '多' : '少'}逻辑运算符:
and、or、not、||、&& 等。#{@NotEmpty(name) == false}if-else 表达式:
?: (ternary 运算符) 或 ?:(Elvis 运算符)。#{car.price > 30 ? '高价' : '低价'}正则表达式匹配:
matches 运算符定义复杂规则。#{car.registrationNumber matches '^A.*' }Spring IOC 容器对 Bean 的生命周期进行管理,包括:
init-method。destroy-method。工厂类:
public class StaticFactory { public static Car getCar(String l) { return new Car("I", 26, 32); }}工厂类:
public class Instance { private Map carMap = new HashMap<>(); public Instance() { carMap.put("I", new Car("I", 26, 32)); } public Car getCar(String l) { return carMap.get(l); }} public class CarBean implements FactoryBean{ private String brand; public Car getObject() { return new Car(brand, 26, 38.5); }}
配置文件:
Spring 能够自动扫描 classpath 下的类,找到带有注解(如 @Component、@Service、@Controller、@Repository)的类,并自动将其注册为 Spring Bean。
基础注入:
@Autowiredprivate UserService userService;
属性命名与注解匹配。
自定义 bean 名称:
@Autowired(required=false)@Qualifier("userRepository")private UserRepository userRepository;注入多个 Bean:
@Autowiredprivate ListuserList;
从 Spring 4.1 开始,支持对泛型属性进行依赖注入。例如:
@AllArgsConstructorpublic class UserService { private UserRepository userRepository;} Spring 支持将多个配置文件合并到一个文件中,例如:
通过这些方法,SpEL 提供了强大的功能,能够简化 Bean 的创建和引用,同时提高应用程序的灵活性和可维护性。
转载地址:http://aevdz.baihongyu.com/