From a8e7fed2954502adcad0ef1bec881176d20403ca Mon Sep 17 00:00:00 2001 From: linlei Date: Mon, 11 Mar 2024 18:07:39 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81EvaluationContext=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E5=88=86=E6=9E=90=202=E3=80=81PropertyAccessor=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-BACK.md | 246 ++++-------- README.md | 366 ++++++------------ .../com/xcs/spring/service/MyService.java | 4 + .../src/main/resources/application.properties | 6 +- spring-spel/pom.xml | 2 + .../spring-spel-evaluationContext/README.md | 290 ++++++++++++++ .../spring-spel-evaluationContext/pom.xml | 16 + .../com/xcs/spring/EvaluationContextDemo.java | 70 ++++ .../spring-spel-propertyAccessor/README.md | 260 +++++++++++++ .../spring-spel-propertyAccessor/pom.xml | 20 + .../src/main/java/com/xcs/spring/MyBean.java | 15 + .../com/xcs/spring/PropertyAccessorDemo.java | 37 ++ 12 files changed, 919 insertions(+), 413 deletions(-) create mode 100644 spring-spel/spring-spel-evaluationContext/README.md create mode 100644 spring-spel/spring-spel-evaluationContext/pom.xml create mode 100644 spring-spel/spring-spel-evaluationContext/src/main/java/com/xcs/spring/EvaluationContextDemo.java create mode 100644 spring-spel/spring-spel-propertyAccessor/README.md create mode 100644 spring-spel/spring-spel-propertyAccessor/pom.xml create mode 100644 spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/MyBean.java create mode 100644 spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/PropertyAccessorDemo.java diff --git a/README-BACK.md b/README-BACK.md index 6da4bda..708e6d7 100644 --- a/README-BACK.md +++ b/README-BACK.md @@ -67,11 +67,11 @@ - [`Resource`](spring-resources/spring-resource/README.md):抽象接口,表示文件、类路径等,用于访问不同来源的资源。 - [`ResourceLoader`](spring-resources/spring-resource-resourceLoader/README.md):资源获取核心接口,实现统一加载不同位置资源的策略。 - + - [`ResourcePatternResolver`](spring-resources/spring-resource-resourcePatternResolver/README.md):资源模式解析接口,用于灵活加载应用中的多种资源。 - [`DocumentLoader`](spring-resources/spring-resource-documentLoader/README.md):XML文档加载解析核心接口,支持后台自动配置Spring应用。 - + - 元数据与过滤 - [`MetadataReader`](spring-metadata/spring-metadata-metadataReader/README.md):类元数据获取核心,支持组件扫描、条件化注解、AOP等高级功能。 @@ -81,7 +81,7 @@ - [`TypeFilter`](spring-metadata/spring-metadata-typeFilter/README.md):组件扫描时自定义类筛选,支持复杂条件和精确过滤。 - [`Condition`](spring-metadata/spring-metadata-condition/README.md):条件判断,决定Bean创建和配置的灵活机制。 - + - Bean定义与注册 - [`BeanDefinition`](spring-beans/spring-bean-beanDefinition/README.md):详细描述Bean,支持依赖注入、AOP、作用域控制等核心功能。 @@ -89,7 +89,7 @@ - [`BeanDefinitionHolder`](spring-beans/spring-bean-beanDefinitionHolder/README.md):管理和操作BeanDefinition的关键类。 - [`BeanDefinitionRegistry`](spring-beans/spring-bean-beanDefinitionRegistry/README.md):Bean定义注册管理关键接口,处理Bean元数据。 - + - Bean定义读取与扫描 - [`XmlBeanDefinitionReader`](spring-beans/spring-bean-xmlBeanDefinitionReader/README.md):加载解析XML配置,构建IOC容器,注册Bean定义。 @@ -115,30 +115,67 @@ - [`Environment`](spring-env/spring-env-environment/README.md):应用环境表示,提供属性访问,支持配置文件,实现动态配置。 - [`ConfigurableEnvironment`](spring-env/spring-env-configurableEnvironment/README.md):动态配置应用环境,激活、默认配置,提升应用灵活性。 - -- 验证、数据绑定和类型转换 - - `Validator` - - `BeanWrapper` - - `PropertyEditor` - - `Converter` +- 验证、数据绑定与类型转换 - - `ConverterFactory` - - `GenericConverter` - - `ConditionalConverter` - - `ConversionService` - - `Parser` - - `Printer` - - `AnnotationFormatterFactory` + - [`Validator`](spring-dataops/spring-dataops-validator/README.md):提供自定义数据验证逻辑,确保模型对象满足业务规则。 + + - [`PropertyEditor`](spring-dataops/spring-dataops-propertyEditor/README.md):自定义JavaBean属性的转换逻辑,处理属性类型转换。 + + - [`Converter`](spring-dataops/spring-dataops-converter/README.md):用于不同类型间的转换,定义简单的源至目标类型转换规则。 + + - [`ConverterFactory`](spring-dataops/spring-dataops-converterFactory/README.md):创建针对特定源类型的转换器,用于类型转换。 + + - [`GenericConverter`](spring-dataops/spring-dataops-genericConverter/README.md):更复杂的转换器,支持多种源和目标类型转换。 + + - [`ConditionalConverter`](spring-dataops/spring-dataops-conditionalConverter/README.md):根据条件选择是否执行转换的转换器。 + + - [`ConversionService`](spring-dataops/spring-dataops-conversionService/README.md):提供统一的类型转换服务接口,管理转换器。 + + - [`Printer`](spring-dataops/spring-dataops-printer/README.md):用于将对象格式化为文本,专注于格式化输出。 + + - [`Parser`](spring-dataops/spring-dataops-parser/README.md):用于将文本解析为对象,专注于解析逻辑。 + + - `BeanWrapper`:用于操作JavaBean的属性,实现动态属性设置和获取。 + + - `AnnotationFormatterFactory`:针对带注解字段的格式化器工厂,链接注解与格式化逻辑。 + +- Spring 表达式语言(SpEL) + + - [`ExpressionParser`](spring-spel/spring-spel-expressionParser/README.md): 解析字符串形式的 SpEL 表达式,创建并返回 Expression 实例。 + + - `EvaluationContext`: 定义用于 SpEL 表达式求值的环境,包括变量、根对象等。 + + - `PropertyAccessor`: 处理属性的读写操作,支持表达式中的属性访问。 + + - `MethodResolver`: 在表达式中解析并调用方法,支持自定义方法解析。 + + - `TypeLocator`: 用于在表达式中定位和引用特定的类型,例如类名。 + + - `TypeConverter`: 实现不同类型间的转换,用于表达式中的值转换。 + + - `BeanResolver`: 用于在表达式中解析并访问 Spring 容器中的 beans。 + + - `ConstructorResolver`: 解析并执行表达式中的构造函数调用。 + + - `OperatorOverloader`: 用于自定义表达式中的操作符行为,如加减乘除。 + + - `ParserContext`: 提供解析 SpEL 表达式时的上下文信息。 + + - `SpelNode`: 构成 SpEL 表达式内部结构的节点,表示表达式的各个部分。 + + - `LiteralExpression`: 表示简单的文字值表达式,如数字、字符串。 + + - `CompoundExpression`: 组合多个子表达式,形成复合的 SpEL 表达式。 - Bean定义导入与组合 - `ImportBeanDefinitionRegistrar`:运行时动态注册 Bean,实现灵活配置,扩展配置类功能。 - + - `ImportSelector`:运行时动态导入配置类,实现条件选择和灵活配置。 - + - `DeferredImportSelector`:运行时动态导入配置,支持条件选择和按组别延迟加载。 - + - Bean工厂 - [`BeanFactory`](spring-factory/spring-factory-beanFactory/README.md):Spring的核心接口,提供对Bean的配置、创建、管理的基本功能。 @@ -148,17 +185,17 @@ - [`HierarchicalBeanFactory`](spring-factory/spring-factory-hierarchicalBeanFactory/README.md):支持父子容器关系,实现Bean定义的层次结构。 - [`ConfigurableBeanFactory`](spring-factory/spring-factory-configurableBeanFactory/README.md):提供对BeanFactory配置的扩展,如属性编辑器、作用域等。 - + + [`AutowireCapableBeanFactory`](spring-factory/spring-factory-autowireCapableBeanFactory/README.md):Bean创建、初始化、注入、销毁的核心功能接口。 + [`ConfigurableListableBeanFactory`](spring-factory/spring-factory-configurableListableBeanFactory/README.md):支持配置和列表操作的可配置Bean工厂接口。 - + - 基于Java的配置 - `ConfigurationClassPostProcessor`:处理@Configuration注解,关键容器启动后置处理器。 - `ConfigurationClassParser`:解析@Configuration,提取Config信息,支持@Bean和条件化配置。 - + - 容器上下文 - [`ClassPathXmlApplicationContext`](spring-context/spring-context-classPathXmlApplicationContext/README.md):类路径(classpath)加载 XML 配置文件的上下文。 @@ -166,7 +203,7 @@ - [`AnnotationConfigApplicationContext`](spring-context/spring-context-annotationConfigApplicationContext/README.md):注解配置类中加载配置信息的上下文。 - `GenericApplicationContext`:支持多种配置方式,XML、注解、手动注册的上下文。 - + - Bean生命周期 - [`Bean的定义注册过程`](spring-core/spring-core-registerBeanDefinition):加载与解析配置文件,注册解析Bean定义,类名、作用域、属性等。 @@ -176,7 +213,7 @@ - [`Bean的依赖解析过程`](spring-core/spring-core-resolveDependency/README.md):声明依赖,查找依赖,注入依赖,处理循环依赖,延迟依赖解析。 - [`Bean的销毁过程`](spring-core/spring-core-destroyBean/README.md):销毁方法调用,接口回调,后处理清理,通知触发,GC回收资源。 - + - Bean初始化与扩展点 - [`InitializingBean`](spring-interface/spring-interface-initializingBean/README.md):提供Bean初始化时执行自定义逻辑的接口。 @@ -198,7 +235,7 @@ - [`SmartInstantiationAwareBeanPostProcessor`](spring-interface/spring-interface-smartInstantiationAwareBeanPostProcessor/README.md):提供更智能的实例化控制。 - [`SmartInitializingSingleton`](spring-interface/spring-interface-smartInitializingSingleton/README.md):在所有单例Bean初始化完成后,执行自定义逻辑。 - + - Aware接口系列 - [`BeanNameAware`](spring-aware/spring-aware-beanNameAware/README.md):让Bean获取自身在容器中的名字。 @@ -222,7 +259,7 @@ - [`ApplicationContextAware`](spring-aware/spring-aware-applicationContextAware/README.md):允许Bean获取应用程序上下文。 - [`ImportAware`](spring-aware/spring-aware-importAware/README.md):允许被导入的配置类获取导入它的类的信息。 - + - 核心注解 - [`@Configuration`](spring-annotation/spring-annotation-configuration/README.md):声明类为配置类,定义Bean和Bean之间的依赖关系。 @@ -245,16 +282,16 @@ - [`@Autowired`](spring-annotation/spring-annotation-autowired/README.md):自动装配Bean依赖。 - - `@Primary`:指定在多个候选Bean中优先选择的首选Bean。 + - `@Primary`:指定在多个候选Bean中优先选择的首选Bean。 - - `@Description`:为Bean提供描述性信息。 + - `@Description`:为Bean提供描述性信息。 - - `@Role`:为Bean提供角色提示,用于区分相似类型的Bean。 + - `@Role`:为Bean提供角色提示,用于区分相似类型的Bean。 - - `@Indexed`: 标记Bean用于索引。 + - `@Indexed`: 标记Bean用于索引。 + + - `@Order`:指定Bean的加载顺序。 - - `@Order`:指定Bean的加载顺序。 - - JSR规范 - [`@Inject`](spring-jsr/spring-jsr330-inject/README.md):JSR-330标准的依赖注入注解。 @@ -275,139 +312,6 @@ - [`Provider`](spring-jsr/spring-jsr330-provider/README.md):Java标准库提供的通用Bean工厂接口。 -#### Spring AOP - -+ AOP 术语:Aspect、Join point、Advice、Pointcut 等 - -+ Spring AOP 实现原理 - -+ 动态代理:JDK 与 CGLIB - -+ @AspectJ 支持与使用 - -+ 切点表达式解析 - -#### Spring 事件机制 - -+ 事件的发布与监听 - -+ 自定义事件 - -#### Spring 事务管理 - -+ Spring 事务管理介绍 - -+ 编程式与声明式事务 - -+ @Transactional 注解解析 - -+ 事务传播行为 - -+ 事务隔离级别 - -+ 事务管理器实现原理 - -#### Spring MVC - -- `@Controller`:定义类为 Spring MVC 控制器,处理请求并返回视图。 - -- `@RequestMapping`:映射请求 URL 到处理方法。 - -- `@RequestMapping`:简化 HTTP 方法映射注解,处理 GET、POST、PUT 和 DELETE 请求。 - -- `@RequestParam`:绑定请求参数到方法参数。 - -- `@PathVariable`:提取 URI 中的模板变量。 - -- `@RequestBody`:绑定请求体内容到方法参数,通常用于处理 POST 请求中的 JSON 数据。 - -- `@ResponseBody`:将方法返回值直接写入 HTTP 响应体。 - -- `@ModelAttribute`:将方法返回值或参数添加到模型,使其在视图中可访问。 - -- `@SessionAttribute`:指定模型属性存储在会话中,以在多个请求之间共享。 - -- `@InitBinder`:定制数据绑定过程,例如将字符串转换为日期。 - -- `@Validated`:类级别注解,标记验证组。 - -- `@ResponseBodyAdvice`:全局定制控制器方法返回值的处理。 - -- `@RestController`:定义类为 RESTful 控制器,直接将每个方法的返回值写入响应体。 - -- `@RequestMappingHandlerMapping`:配置自定义的请求映射处理器。 - -- `@SessionAttributes`:控制器类上标记,指定哪些模型属性存储在会话中,用于在多个请求中共享。 - -- `@ModelAttribute`:在方法级别和参数级别使用,将模型属性绑定到方法参数,实现数据传递。 - -- `@SessionAttribute`:将模型属性存储在会话中,实现在多个请求中的数据共享。 - -- `@InitBinder`:在类和方法级别使用,定制数据绑定过程,例如字符串转日期。 - -- `@Validated`:类级别注解,标记验证组,与验证框架一起使用。 - -- `@ResponseBodyAdvice`:全局处理控制器方法返回值,用于定制响应体逻辑。 - -- `@RestController`:类似于 @Controller,专注于 RESTful 服务,直接将方法返回值写入响应体。 - -- `@RequestMappingHandlerMappin`g:配置自定义请求映射处理器,用于个性化 URL 映射逻辑。 - -#### Spring Boot - -+ `@SpringBootApplication`:启动类标识,包含了组合注解 。 - -+ `@EnableAutoConfiguration`:启用 Spring Boot 的自动配置。 - -+ `@ConfigurationProperties`:将配置文件中的属性值注入到配置类的属性中。 - -+ `@EnableCaching`:启用缓存支持。 - -+ `@Async`:异步方法注解。 - -+ `@EventListener`:监听事件。 - -#### Spring Cloud - -- `@EnableDiscoveryClient`:启用服务发现客户端,用于将服务注册到服务注册中心(例如 Eureka)。 - -- `@EnableEurekaServer`:启用 Eureka 服务端,用于搭建服务注册中心。 - -- `@LoadBalanced`:启用负载均衡,通常用于 RestTemplate 和 WebClient,使其具备负载均衡的能力。 - -- `@FeignClient`:声明一个声明式的 HTTP 客户端,简化了服务调用的过程。 - -- `@EnableCircuitBreaker`:启用断路器,用于防止分布式系统中的雪崩效应。 - -- `@HystrixCommand`:定义一个熔断器命令。 - -- `@EnableZuulProxy`:启用 Zuul API 网关代理。 - -- `@ZuulRoute`:用于配置 Zuul 路由。 - -- `@EnableConfigServer`:启用配置中心服务端。 - -- `@RefreshScope`:用于刷新配置,通常与 Spring Cloud Config 配合使用。 - -- `@EnableZipkinServer`:启用 Zipkin 服务器,用于分布式链路追踪。 - -- `@EnableBinding`:绑定消息通道,与 Spring Cloud Stream 配合使用。 - -- `@GlobalTransactional`:全局事务注解,与 Seata 等分布式事务框架配合使用。 - -- `@SentinelResource`:Sentinel 限流和熔断注解。 - -- `@DubboTransported`:用于 Dubbo 服务的注解。 - -- `@NacosInjected`:用于注入 Nacos 相关的实例。 - - -#### Spring 编程风格与设计模式 - -+ 设计模式在 Spring 源码中的应用 - -+ Spring 源码阅读技巧 - ## 💬与我联系 ✉️ [Email](xuchengshengsuper@163.com) | 💬 [Issue](https://github.com/xuchengsheng/spring-reading/issues) | 🌐 [CSDN](https://blog.csdn.net/duzhuang2399?type=blog) Me about everything! @@ -434,9 +338,17 @@ ## 👥加入我们 -欢迎加入我们的群聊!一起探讨、分享和学习吧! 🌐 +📢 想要一起加入我们的精彩微信群吗?跟着以下简单步骤: + +1️⃣ **扫描我的二维码**:使用微信的扫一扫功能,扫描下方的二维码,将我添加为你的好友。
logo
+2️⃣ **等待好友请求被接受**:一旦你的好友请求被接受,你将收到一份群组邀请。 + +3️⃣ **点击邀请链接**:打开邀请链接,立即加入我们的精彩群组! + +4️⃣ **尽情参与和分享**:在群组中,你将有机会与其他成员分享观点、经验和信息。我们热切期待你的参与! + diff --git a/README.md b/README.md index 4548017..2a62b17 100644 --- a/README.md +++ b/README.md @@ -60,257 +60,133 @@ ## 🌱Spring 源码阅读系列 -#### Spring IOC ++ Spring Core + + Resources + - [`Resource`](spring-resources/spring-resource/README.md):抽象接口,表示文件、类路径等,用于访问不同来源的资源。 + - [`ResourceLoader`](spring-resources/spring-resource-resourceLoader/README.md):资源获取核心接口,实现统一加载不同位置资源的策略。 + - [`ResourcePatternResolver`](spring-resources/spring-resource-resourcePatternResolver/README.md):资源模式解析接口,用于灵活加载应用中的多种资源。 + - [`DocumentLoader`](spring-resources/spring-resource-documentLoader/README.md):XML文档加载解析核心接口,支持后台自动配置Spring应用。 + - [`MetadataReader`](spring-metadata/spring-metadata-metadataReader/README.md):类元数据获取核心,支持组件扫描、条件化注解、AOP等高级功能。 + - [`AnnotationMetadata`](spring-metadata/spring-metadata-annotationMetadata/README.md):动态获取和操作运行时类注解信息。 + - [`TypeFilter`](spring-metadata/spring-metadata-typeFilter/README.md):组件扫描时自定义类筛选,支持复杂条件和精确过滤。 + - [`Condition`](spring-metadata/spring-metadata-condition/README.md):条件判断,决定Bean创建和配置的灵活机制。 + + 验证、数据绑定和类型转换 + - [`Validator`](spring-dataops/spring-dataops-validator/README.md):提供自定义数据验证逻辑,确保模型对象满足业务规则。 + - [`PropertyEditor`](spring-dataops/spring-dataops-propertyEditor/README.md):自定义JavaBean属性的转换逻辑,处理属性类型转换。 + - [`Converter`](spring-dataops/spring-dataops-converter/README.md):用于不同类型间的转换,定义简单的源至目标类型转换规则。 + - [`ConverterFactory`](spring-dataops/spring-dataops-converterFactory/README.md):创建针对特定源类型的转换器,用于类型转换。 + - [`GenericConverter`](spring-dataops/spring-dataops-genericConverter/README.md):更复杂的转换器,支持多种源和目标类型转换。 + - [`ConditionalConverter`](spring-dataops/spring-dataops-conditionalConverter/README.md):根据条件选择是否执行转换的转换器。 + - [`ConversionService`](spring-dataops/spring-dataops-conversionService/README.md):提供统一的类型转换服务接口,管理转换器。 + - [`Printer`](spring-dataops/spring-dataops-printer/README.md):用于将对象格式化为文本,专注于格式化输出。 + - [`Parser`](spring-dataops/spring-dataops-parser/README.md):用于将文本解析为对象,专注于解析逻辑。 + - `BeanWrapper`:用于操作JavaBean的属性,实现动态属性设置和获取。 + - `AnnotationFormatterFactory`:针对带注解字段的格式化器工厂,链接注解与格式化逻辑。 + + Spring 表达式语言(SpEL) + - [`EvaluationContext`](spring-spel/spring-spel-evaluationContext/README.md): 管理SpEL表达式的上下文信息 + - [`PropertyAccessor`](spring-spel/spring-spel-propertyAccessor/README.md): 用于读取和写入对象的属性,可用于实现自定义的属性访问逻辑 + - [`ExpressionParser`](spring-spel/spring-spel-expressionParser/README.md): 解析字符串形式的 SpEL 表达式,创建并返回 Expression 实例。 + + IOC 容器 + + Bean工厂 + - [`BeanFactory`](spring-factory/spring-factory-beanFactory/README.md):Spring的核心接口,提供对Bean的配置、创建、管理的基本功能。 + - [`ListableBeanFactory`](spring-factory/spring-factory-listableBeanFactory/README.md):支持按类型获取Bean的集合。 + - [`HierarchicalBeanFactory`](spring-factory/spring-factory-hierarchicalBeanFactory/README.md):支持父子容器关系,实现Bean定义的层次结构。 + - [`ConfigurableBeanFactory`](spring-factory/spring-factory-configurableBeanFactory/README.md):提供对BeanFactory配置的扩展,如属性编辑器、作用域等。 + + [`AutowireCapableBeanFactory`](spring-factory/spring-factory-autowireCapableBeanFactory/README.md):Bean创建、初始化、注入、销毁的核心功能接口。 + + [`ConfigurableListableBeanFactory`](spring-factory/spring-factory-configurableListableBeanFactory/README.md):支持配置和列表操作的可配置Bean工厂接口。 + - 容器上下文 + - [`ClassPathXmlApplicationContext`](spring-context/spring-context-classPathXmlApplicationContext/README.md):类路径(classpath)加载 XML 配置文件的上下文。 + - [`AnnotationConfigApplicationContext`](spring-context/spring-context-annotationConfigApplicationContext/README.md):注解配置类中加载配置信息的上下文。 + - `GenericApplicationContext`:支持多种配置方式,XML、注解、手动注册的上下文。 + - Bean定义与注册 + - [`BeanDefinition`](spring-beans/spring-bean-beanDefinition/README.md):详细描述Bean,支持依赖注入、AOP、作用域控制等核心功能。 + - [`BeanDefinitionHolder`](spring-beans/spring-bean-beanDefinitionHolder/README.md):管理和操作BeanDefinition的关键类。 + - [`BeanDefinitionRegistry`](spring-beans/spring-bean-beanDefinitionRegistry/README.md):Bean定义注册管理关键接口,处理Bean元数据。 + - Bean定义读取与扫描 + - [`XmlBeanDefinitionReader`](spring-beans/spring-bean-xmlBeanDefinitionReader/README.md):加载解析XML配置,构建IOC容器,注册Bean定义。 + - [`PropertiesBeanDefinitionReader`](spring-beans/spring-bean-propertiesBeanDefinitionReader/README.md):属性文件加载,解析为Bean定义。 + - [`GroovyBeanDefinitionReader`](spring-beans/spring-bean-groovyBeanDefinitionReader/README.md):Groovy脚本解析为Bean定义。 + - [`AnnotatedBeanDefinitionReader`](spring-beans/spring-bean-annotatedBeanDefinitionReader/README.md):注解配置,自动扫描注册Spring组件,简化Bean定义配置。 + - [`ClassPathBeanDefinitionScanner`](spring-beans/spring-bean-classPathBeanDefinitionScanner/README.md):类路径扫描注册Spring Bean,支持自动装配。 + - Bean定义导入与组合 + - `ImportBeanDefinitionRegistrar`:运行时动态注册 Bean,实现灵活配置,扩展配置类功能。 + - `ImportSelector`:运行时动态导入配置类,实现条件选择和灵活配置。 + - `DeferredImportSelector`:运行时动态导入配置,支持条件选择和按组别延迟加载。 + - Bean生命周期 + - [`Bean的定义注册过程`](spring-core/spring-core-registerBeanDefinition):加载与解析配置文件,注册解析Bean定义,类名、作用域、属性等。 + - [`Bean的初始化过程`](spring-core/spring-core-getBean/README.md):实例化、属性注入、Aware回调、后置处理器、初始化方法调用、Bean就绪。 + - [`Bean的依赖解析过程`](spring-core/spring-core-resolveDependency/README.md):声明依赖,查找依赖,注入依赖,处理循环依赖,延迟依赖解析。 + - [`Bean的销毁过程`](spring-core/spring-core-destroyBean/README.md):销毁方法调用,接口回调,后处理清理,通知触发,GC回收资源。 + - 属性解析和环境配置 + - [`PropertySource`](spring-env/spring-env-propertySource/README.md):管理各种配置源的抽象类,支持灵活地加载和访问应用配置。 + - [`PropertySources`](spring-env/spring-env-propertySources/README.md):用于统一管理和访问多个 PropertySource 实例,简化配置数据的处理。 + - [`PropertyResolver`](spring-env/spring-env-propertyResolver/README.md):通用属性解析,获取配置值,处理属性缺失,简便灵活。 + - [`ConfigurablePropertyResolver`](spring-env/spring-env-configurablePropertyResolver/README.md):属性解析配置,占位符设置,适应不同配置需求。 + - [`Environment`](spring-env/spring-env-environment/README.md):应用环境表示,提供属性访问,支持配置文件,实现动态配置。 + - [`ConfigurableEnvironment`](spring-env/spring-env-configurableEnvironment/README.md):动态配置应用环境,激活、默认配置,提升应用灵活性。 + - Bean初始化与扩展点 + - [`InitializingBean`](spring-interface/spring-interface-initializingBean/README.md):提供Bean初始化时执行自定义逻辑的接口。 + - [`DisposableBean`](spring-interface/spring-interface-disposableBean/README.md):定义Bean销毁前执行清理操作的接口。 + - [`BeanDefinitionRegistryPostProcessor`](spring-interface/spring-interface-beanDefinitionRegistryPostProcessor/README.md):在容器启动时,对BeanDefinition进行动态修改或添加。 + - [`BeanFactoryPostProcessor`](spring-interface/spring-interface-beanFactoryPostProcessor/README.md):在Bean实例化前,对BeanFactory进行全局修改或配置。 + - [`BeanPostProcessor`](spring-interface/spring-interface-beanPostProcessor/README.md):在Bean初始化前后,进行自定义处理,可影响所有Bean。 + - [`InstantiationAwareBeanPostProcessor`](spring-interface/spring-interface-instantiationAwareBeanPostProcessor/README.md):提供更深层次的实例化和属性注入控制。 + - [`DestructionAwareBeanPostProcessor`](spring-interface/spring-interface-destructionAwareBeanPostProcessor/README.md): 允许在Bean销毁前进行额外的清理操作。 + - [`MergedBeanDefinitionPostProcessor`](spring-interface/spring-interface-mergedBeanDefinitionPostProcessor/README.md):在合并Bean定义时,对BeanDefinition进行进一步处理。 + - [`SmartInstantiationAwareBeanPostProcessor`](spring-interface/spring-interface-smartInstantiationAwareBeanPostProcessor/README.md):提供更智能的实例化控制。 + - [`SmartInitializingSingleton`](spring-interface/spring-interface-smartInitializingSingleton/README.md):在所有单例Bean初始化完成后,执行自定义逻辑。 + - Aware接口系列 + - [`BeanNameAware`](spring-aware/spring-aware-beanNameAware/README.md):让Bean获取自身在容器中的名字。 + - [`BeanClassLoaderAware`](spring-aware/spring-aware-beanClassLoaderAware/README.md):允许Bean获取其类加载器。 + - [`BeanFactoryAware`](spring-aware/spring-aware-beanFactoryAware/README.md):提供Bean获取所属的BeanFactory。 + - [`EnvironmentAware`](spring-aware/spring-aware-environmentAware/README.md):允许Bean获取应用程序环境配置。 + - [`EmbeddedValueResolverAware`](spring-aware/spring-aware-embeddedValueResolverAware/README.md):允许Bean解析嵌入式值占位符。 + - [`ResourceLoaderAware`](spring-aware/spring-aware-beanClassLoaderAware/README.md):允许Bean获取资源加载器。 + - [`ApplicationEventPublisherAware`](spring-aware/spring-aware-applicationEventPublisherAware/README.md):允许Bean发布应用程序事件。 + - [`MessageSourceAware`](spring-aware/spring-aware-messageSourceAware/README.md):允许Bean获取消息源。 + - [`ApplicationStartupAware`](spring-aware/spring-aware-applicationStartupAware/README.md):允许Bean获取应用程序启动信息。 + - [`ApplicationContextAware`](spring-aware/spring-aware-applicationContextAware/README.md):允许Bean获取应用程序上下文。 + - [`ImportAware`](spring-aware/spring-aware-importAware/README.md):允许被导入的配置类获取导入它的类的信息。 + - 核心注解 + - [`@Configuration`](spring-annotation/spring-annotation-configuration/README.md):声明类为配置类,定义Bean和Bean之间的依赖关系。 + - [`@ComponentScan`](spring-annotation/spring-annotation-componentScan/README.md):启用组件扫描,自动发现并注册标记为组件的类。 + - [`@Bean`](spring-annotation/spring-annotation-bean/README.md):在配置类中声明方法,返回Bean实例。 + - [`@Import`](spring-annotation/spring-annotation-import/README.md):引入其他配置类,将其Bean定义合并到当前容器。 + - [`@PropertySource`](spring-annotation/spring-annotation-propertySource/README.md):指定属性文件,加载外部配置到环境中。 + - [`@DependsOn`](spring-annotation/spring-annotation-dependsOn/README.md):指定Bean的依赖顺序,确保特定Bean在其他Bean之前初始化。 + - [`@Conditional`](spring-annotation/spring-annotation-conditional/README.md):根据条件决定是否创建Bean。 + - [`@Lazy`](spring-annotation/spring-annotation-lazy/README.md):指定Bean的延迟初始化,只有在首次使用时才创建。 + - [`@Value`](spring-annotation/spring-annotation-value/README.md):注入简单值或表达式到Bean的字段或方法参数。 + - [`@Autowired`](spring-annotation/spring-annotation-autowired/README.md):自动装配Bean依赖。 + - `@Primary`:指定在多个候选Bean中优先选择的首选Bean。 + - `@Description`:为Bean提供描述性信息。 + - `@Role`:为Bean提供角色提示,用于区分相似类型的Bean。 + - `@Indexed`: 标记Bean用于索引。 + - `@Order`:指定Bean的加载顺序。 + - JSR规范 + - [`@Inject`](spring-jsr/spring-jsr330-inject/README.md):JSR-330标准的依赖注入注解。 + - [`@Named`](spring-jsr/spring-jsr330-named/README.md):JSR-330标准的命名注解。 + - [`@Resource`](spring-jsr/spring-jsr250-resource/README.md):Java EE标准的资源注入注解。 + - [`@Qualifier`](spring-jsr/spring-jsr330-qualifier/README.md):用于限定注入的Bean。 + - [`@Scope`](spring-jsr/spring-jsr330-scope/README.md):指定Bean的作用域。 + - [`@Singleton`](spring-jsr/spring-jsr330-singleton/README.md):指定Bean为单例。 + - [`@PostConstruct`](spring-jsr/spring-jsr250-postConstruct/README.md):指定初始化方法。 + - [`@PreDestroy`](spring-jsr/spring-jsr250-preDestroy/README.md):指定销毁方法。 + - [`Provider`](spring-jsr/spring-jsr330-provider/README.md):Java标准库提供的通用Bean工厂接口。 -- 资源加载与访问 + + Spring AOP - - [`Resource`](spring-resources/spring-resource/README.md):抽象接口,表示文件、类路径等,用于访问不同来源的资源。 + + Spring AOT - - [`ResourceLoader`](spring-resources/spring-resource-resourceLoader/README.md):资源获取核心接口,实现统一加载不同位置资源的策略。 + + Spring Log + + + Data Buffer 和编解码器 - - [`ResourcePatternResolver`](spring-resources/spring-resource-resourcePatternResolver/README.md):资源模式解析接口,用于灵活加载应用中的多种资源。 ++ Spring MVC - - [`DocumentLoader`](spring-resources/spring-resource-documentLoader/README.md):XML文档加载解析核心接口,支持后台自动配置Spring应用。 - -- 元数据与过滤 ++ Spring 事务 - - [`MetadataReader`](spring-metadata/spring-metadata-metadataReader/README.md):类元数据获取核心,支持组件扫描、条件化注解、AOP等高级功能。 - - - [`AnnotationMetadata`](spring-metadata/spring-metadata-annotationMetadata/README.md):动态获取和操作运行时类注解信息。 - - - [`TypeFilter`](spring-metadata/spring-metadata-typeFilter/README.md):组件扫描时自定义类筛选,支持复杂条件和精确过滤。 - - - [`Condition`](spring-metadata/spring-metadata-condition/README.md):条件判断,决定Bean创建和配置的灵活机制。 - -- Bean定义与注册 - - - [`BeanDefinition`](spring-beans/spring-bean-beanDefinition/README.md):详细描述Bean,支持依赖注入、AOP、作用域控制等核心功能。 - - - [`BeanDefinitionHolder`](spring-beans/spring-bean-beanDefinitionHolder/README.md):管理和操作BeanDefinition的关键类。 - - - [`BeanDefinitionRegistry`](spring-beans/spring-bean-beanDefinitionRegistry/README.md):Bean定义注册管理关键接口,处理Bean元数据。 - -- Bean定义读取与扫描 - - - [`XmlBeanDefinitionReader`](spring-beans/spring-bean-xmlBeanDefinitionReader/README.md):加载解析XML配置,构建IOC容器,注册Bean定义。 - - - [`PropertiesBeanDefinitionReader`](spring-beans/spring-bean-propertiesBeanDefinitionReader/README.md):属性文件加载,解析为Bean定义。 - - - [`GroovyBeanDefinitionReader`](spring-beans/spring-bean-groovyBeanDefinitionReader/README.md):Groovy脚本解析为Bean定义。 - - - [`AnnotatedBeanDefinitionReader`](spring-beans/spring-bean-annotatedBeanDefinitionReader/README.md):注解配置,自动扫描注册Spring组件,简化Bean定义配置。 - - - [`ClassPathBeanDefinitionScanner`](spring-beans/spring-bean-classPathBeanDefinitionScanner/README.md):类路径扫描注册Spring Bean,支持自动装配。 - -- 属性解析和环境配置 - - - [`PropertySource`](spring-env/spring-env-propertySource/README.md):管理各种配置源的抽象类,支持灵活地加载和访问应用配置。 - - - [`PropertySources`](spring-env/spring-env-propertySources/README.md):用于统一管理和访问多个 PropertySource 实例,简化配置数据的处理。 - - - [`PropertyResolver`](spring-env/spring-env-propertyResolver/README.md):通用属性解析,获取配置值,处理属性缺失,简便灵活。 - - - [`ConfigurablePropertyResolver`](spring-env/spring-env-configurablePropertyResolver/README.md):属性解析配置,占位符设置,适应不同配置需求。 - - - [`Environment`](spring-env/spring-env-environment/README.md):应用环境表示,提供属性访问,支持配置文件,实现动态配置。 - - - [`ConfigurableEnvironment`](spring-env/spring-env-configurableEnvironment/README.md):动态配置应用环境,激活、默认配置,提升应用灵活性。 - -- 验证、数据绑定与类型转换 - - - [`Validator`](spring-dataops/spring-dataops-validator/README.md):提供自定义数据验证逻辑,确保模型对象满足业务规则。 - - - [`PropertyEditor`](spring-dataops/spring-dataops-propertyEditor/README.md):自定义JavaBean属性的转换逻辑,处理属性类型转换。 - - - [`Converter`](spring-dataops/spring-dataops-converter/README.md):用于不同类型间的转换,定义简单的源至目标类型转换规则。 - - - [`ConverterFactory`](spring-dataops/spring-dataops-converterFactory/README.md):创建针对特定源类型的转换器,用于类型转换。 - - - [`GenericConverter`](spring-dataops/spring-dataops-genericConverter/README.md):更复杂的转换器,支持多种源和目标类型转换。 - - - [`ConditionalConverter`](spring-dataops/spring-dataops-conditionalConverter/README.md):根据条件选择是否执行转换的转换器。 - - - [`ConversionService`](spring-dataops/spring-dataops-conversionService/README.md):提供统一的类型转换服务接口,管理转换器。 - - - [`Printer`](spring-dataops/spring-dataops-printer/README.md):用于将对象格式化为文本,专注于格式化输出。 - - - [`Parser`](spring-dataops/spring-dataops-parser/README.md):用于将文本解析为对象,专注于解析逻辑。 - - - `BeanWrapper`:用于操作JavaBean的属性,实现动态属性设置和获取。 - - - `AnnotationFormatterFactory`:针对带注解字段的格式化器工厂,链接注解与格式化逻辑。 - -- Spring 表达式语言(SpEL) - - - [`ExpressionParser`](spring-spel/spring-spel-expressionParser/README.md): 解析字符串形式的 SpEL 表达式,创建并返回 Expression 实例。 - - - `EvaluationContext`: 定义用于 SpEL 表达式求值的环境,包括变量、根对象等。 - - - `PropertyAccessor`: 处理属性的读写操作,支持表达式中的属性访问。 - - - `MethodResolver`: 在表达式中解析并调用方法,支持自定义方法解析。 - - - `TypeLocator`: 用于在表达式中定位和引用特定的类型,例如类名。 - - - `TypeConverter`: 实现不同类型间的转换,用于表达式中的值转换。 - - - `BeanResolver`: 用于在表达式中解析并访问 Spring 容器中的 beans。 - - - `ConstructorResolver`: 解析并执行表达式中的构造函数调用。 - - - `OperatorOverloader`: 用于自定义表达式中的操作符行为,如加减乘除。 - - - `ParserContext`: 提供解析 SpEL 表达式时的上下文信息。 - - - `SpelNode`: 构成 SpEL 表达式内部结构的节点,表示表达式的各个部分。 - - - `LiteralExpression`: 表示简单的文字值表达式,如数字、字符串。 - - - `CompoundExpression`: 组合多个子表达式,形成复合的 SpEL 表达式。 - -- Bean定义导入与组合 - - - `ImportBeanDefinitionRegistrar`:运行时动态注册 Bean,实现灵活配置,扩展配置类功能。 - - - `ImportSelector`:运行时动态导入配置类,实现条件选择和灵活配置。 - - - `DeferredImportSelector`:运行时动态导入配置,支持条件选择和按组别延迟加载。 - -- Bean工厂 - - - [`BeanFactory`](spring-factory/spring-factory-beanFactory/README.md):Spring的核心接口,提供对Bean的配置、创建、管理的基本功能。 - - - [`ListableBeanFactory`](spring-factory/spring-factory-listableBeanFactory/README.md):支持按类型获取Bean的集合。 - - - [`HierarchicalBeanFactory`](spring-factory/spring-factory-hierarchicalBeanFactory/README.md):支持父子容器关系,实现Bean定义的层次结构。 - - - [`ConfigurableBeanFactory`](spring-factory/spring-factory-configurableBeanFactory/README.md):提供对BeanFactory配置的扩展,如属性编辑器、作用域等。 - - + [`AutowireCapableBeanFactory`](spring-factory/spring-factory-autowireCapableBeanFactory/README.md):Bean创建、初始化、注入、销毁的核心功能接口。 - - + [`ConfigurableListableBeanFactory`](spring-factory/spring-factory-configurableListableBeanFactory/README.md):支持配置和列表操作的可配置Bean工厂接口。 - -- 基于Java的配置 - - - `ConfigurationClassPostProcessor`:处理@Configuration注解,关键容器启动后置处理器。 - - - `ConfigurationClassParser`:解析@Configuration,提取Config信息,支持@Bean和条件化配置。 - -- 容器上下文 - - - [`ClassPathXmlApplicationContext`](spring-context/spring-context-classPathXmlApplicationContext/README.md):类路径(classpath)加载 XML 配置文件的上下文。 - - - [`AnnotationConfigApplicationContext`](spring-context/spring-context-annotationConfigApplicationContext/README.md):注解配置类中加载配置信息的上下文。 - - - `GenericApplicationContext`:支持多种配置方式,XML、注解、手动注册的上下文。 - -- Bean生命周期 - - - [`Bean的定义注册过程`](spring-core/spring-core-registerBeanDefinition):加载与解析配置文件,注册解析Bean定义,类名、作用域、属性等。 - - - [`Bean的初始化过程`](spring-core/spring-core-getBean/README.md):实例化、属性注入、Aware回调、后置处理器、初始化方法调用、Bean就绪。 - - - [`Bean的依赖解析过程`](spring-core/spring-core-resolveDependency/README.md):声明依赖,查找依赖,注入依赖,处理循环依赖,延迟依赖解析。 - - - [`Bean的销毁过程`](spring-core/spring-core-destroyBean/README.md):销毁方法调用,接口回调,后处理清理,通知触发,GC回收资源。 - -- Bean初始化与扩展点 - - - [`InitializingBean`](spring-interface/spring-interface-initializingBean/README.md):提供Bean初始化时执行自定义逻辑的接口。 - - - [`DisposableBean`](spring-interface/spring-interface-disposableBean/README.md):定义Bean销毁前执行清理操作的接口。 - - - [`BeanDefinitionRegistryPostProcessor`](spring-interface/spring-interface-beanDefinitionRegistryPostProcessor/README.md):在容器启动时,对BeanDefinition进行动态修改或添加。 - - - [`BeanFactoryPostProcessor`](spring-interface/spring-interface-beanFactoryPostProcessor/README.md):在Bean实例化前,对BeanFactory进行全局修改或配置。 - - - [`BeanPostProcessor`](spring-interface/spring-interface-beanPostProcessor/README.md):在Bean初始化前后,进行自定义处理,可影响所有Bean。 - - - [`InstantiationAwareBeanPostProcessor`](spring-interface/spring-interface-instantiationAwareBeanPostProcessor/README.md):提供更深层次的实例化和属性注入控制。 - - - [`DestructionAwareBeanPostProcessor`](spring-interface/spring-interface-destructionAwareBeanPostProcessor/README.md): 允许在Bean销毁前进行额外的清理操作。 - - - [`MergedBeanDefinitionPostProcessor`](spring-interface/spring-interface-mergedBeanDefinitionPostProcessor/README.md):在合并Bean定义时,对BeanDefinition进行进一步处理。 - - - [`SmartInstantiationAwareBeanPostProcessor`](spring-interface/spring-interface-smartInstantiationAwareBeanPostProcessor/README.md):提供更智能的实例化控制。 - - - [`SmartInitializingSingleton`](spring-interface/spring-interface-smartInitializingSingleton/README.md):在所有单例Bean初始化完成后,执行自定义逻辑。 - -- Aware接口系列 - - - [`BeanNameAware`](spring-aware/spring-aware-beanNameAware/README.md):让Bean获取自身在容器中的名字。 - - - [`BeanClassLoaderAware`](spring-aware/spring-aware-beanClassLoaderAware/README.md):允许Bean获取其类加载器。 - - - [`BeanFactoryAware`](spring-aware/spring-aware-beanFactoryAware/README.md):提供Bean获取所属的BeanFactory。 - - - [`EnvironmentAware`](spring-aware/spring-aware-environmentAware/README.md):允许Bean获取应用程序环境配置。 - - - [`EmbeddedValueResolverAware`](spring-aware/spring-aware-embeddedValueResolverAware/README.md):允许Bean解析嵌入式值占位符。 - - - [`ResourceLoaderAware`](spring-aware/spring-aware-beanClassLoaderAware/README.md):允许Bean获取资源加载器。 - - - [`ApplicationEventPublisherAware`](spring-aware/spring-aware-applicationEventPublisherAware/README.md):允许Bean发布应用程序事件。 - - - [`MessageSourceAware`](spring-aware/spring-aware-messageSourceAware/README.md):允许Bean获取消息源。 - - - [`ApplicationStartupAware`](spring-aware/spring-aware-applicationStartupAware/README.md):允许Bean获取应用程序启动信息。 - - - [`ApplicationContextAware`](spring-aware/spring-aware-applicationContextAware/README.md):允许Bean获取应用程序上下文。 - - - [`ImportAware`](spring-aware/spring-aware-importAware/README.md):允许被导入的配置类获取导入它的类的信息。 - -- 核心注解 - - - [`@Configuration`](spring-annotation/spring-annotation-configuration/README.md):声明类为配置类,定义Bean和Bean之间的依赖关系。 - - - [`@ComponentScan`](spring-annotation/spring-annotation-componentScan/README.md):启用组件扫描,自动发现并注册标记为组件的类。 - - - [`@Bean`](spring-annotation/spring-annotation-bean/README.md):在配置类中声明方法,返回Bean实例。 - - - [`@Import`](spring-annotation/spring-annotation-import/README.md):引入其他配置类,将其Bean定义合并到当前容器。 - - - [`@PropertySource`](spring-annotation/spring-annotation-propertySource/README.md):指定属性文件,加载外部配置到环境中。 - - - [`@DependsOn`](spring-annotation/spring-annotation-dependsOn/README.md):指定Bean的依赖顺序,确保特定Bean在其他Bean之前初始化。 - - - [`@Conditional`](spring-annotation/spring-annotation-conditional/README.md):根据条件决定是否创建Bean。 - - - [`@Lazy`](spring-annotation/spring-annotation-lazy/README.md):指定Bean的延迟初始化,只有在首次使用时才创建。 - - - [`@Value`](spring-annotation/spring-annotation-value/README.md):注入简单值或表达式到Bean的字段或方法参数。 - - - [`@Autowired`](spring-annotation/spring-annotation-autowired/README.md):自动装配Bean依赖。 - - - `@Primary`:指定在多个候选Bean中优先选择的首选Bean。 - - - `@Description`:为Bean提供描述性信息。 - - - `@Role`:为Bean提供角色提示,用于区分相似类型的Bean。 - - - `@Indexed`: 标记Bean用于索引。 - - - `@Order`:指定Bean的加载顺序。 - -- JSR规范 - - - [`@Inject`](spring-jsr/spring-jsr330-inject/README.md):JSR-330标准的依赖注入注解。 - - - [`@Named`](spring-jsr/spring-jsr330-named/README.md):JSR-330标准的命名注解。 - - - [`@Resource`](spring-jsr/spring-jsr250-resource/README.md):Java EE标准的资源注入注解。 - - - [`@Qualifier`](spring-jsr/spring-jsr330-qualifier/README.md):用于限定注入的Bean。 - - - [`@Scope`](spring-jsr/spring-jsr330-scope/README.md):指定Bean的作用域。 - - - [`@Singleton`](spring-jsr/spring-jsr330-singleton/README.md):指定Bean为单例。 - - - [`@PostConstruct`](spring-jsr/spring-jsr250-postConstruct/README.md):指定初始化方法。 - - - [`@PreDestroy`](spring-jsr/spring-jsr250-preDestroy/README.md):指定销毁方法。 - - - [`Provider`](spring-jsr/spring-jsr330-provider/README.md):Java标准库提供的通用Bean工厂接口。 ++ Spring OpenFeign ## 💬与我联系 diff --git a/spring-annotation/spring-annotation-value/src/main/java/com/xcs/spring/service/MyService.java b/spring-annotation/spring-annotation-value/src/main/java/com/xcs/spring/service/MyService.java index 3e966df..5cc8b93 100644 --- a/spring-annotation/spring-annotation-value/src/main/java/com/xcs/spring/service/MyService.java +++ b/spring-annotation/spring-annotation-value/src/main/java/com/xcs/spring/service/MyService.java @@ -42,6 +42,9 @@ public class MyService implements InitializingBean { @Value("#{${app.val1} + ${app.val2}}") private int sumOfValues; + @Value("${myapp.names[0]}") + private String firstName; + @Override public void afterPropertiesSet() throws Exception { System.out.println("直接注入值: " + someString); @@ -49,5 +52,6 @@ public class MyService implements InitializingBean { System.out.println("使用默认值: " + appDescription); System.out.println("注入列表和属性: " + servers); System.out.println("使用Spring的SpEL: " + sumOfValues); + System.out.println("firstName: " + firstName); } } diff --git a/spring-annotation/spring-annotation-value/src/main/resources/application.properties b/spring-annotation/spring-annotation-value/src/main/resources/application.properties index 5f9c6d3..f81812d 100644 --- a/spring-annotation/spring-annotation-value/src/main/resources/application.properties +++ b/spring-annotation/spring-annotation-value/src/main/resources/application.properties @@ -1,4 +1,8 @@ app.name=My Spring Application app.servers=server1,server2,server3 app.val1=10 -app.val2=20 \ No newline at end of file +app.val2=20 + +myapp.names[0]=Alice +myapp.names[1]=Bob +myapp.names[2]=Charlie \ No newline at end of file diff --git a/spring-spel/pom.xml b/spring-spel/pom.xml index 4a961a6..81c9124 100644 --- a/spring-spel/pom.xml +++ b/spring-spel/pom.xml @@ -14,6 +14,8 @@ spring-spel-expressionParser + spring-spel-evaluationContext + spring-spel-propertyAccessor \ No newline at end of file diff --git a/spring-spel/spring-spel-evaluationContext/README.md b/spring-spel/spring-spel-evaluationContext/README.md new file mode 100644 index 0000000..e65a1ae --- /dev/null +++ b/spring-spel/spring-spel-evaluationContext/README.md @@ -0,0 +1,290 @@ +## EvaluationContext + +- [EvaluationContext](#evaluationcontext) + - [一、基本信息](#一基本信息) + - [二、知识储备](#二知识储备) + - [三、基本描述](#三基本描述) + - [四、主要功能](#四主要功能) + - [五、接口源码](#五接口源码) + - [六、主要实现](#六主要实现) + - [七、最佳实践](#七最佳实践) + - [八、与其他组件的关系](#八与其他组件的关系) + - [九、常见问题](#九常见问题) + + +### 一、基本信息 + +✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading) + +### 二、知识储备 + +1. **Spring Framework 基础** + + + 理解 Spring Framework 的核心概念和基本用法对于理解 `SpEL` 是至关重要的。这包括理解依赖注入、控制反转、面向切面编程等概念。 + +2. **Spring Expression Language(`SpEL`)** + + 熟悉 `SpEL` 的语法、功能和用法是必要的。这包括了解如何在 Spring 应用程序中使用 `SpEL` 表达式,如何在 XML 配置、注解、Spring Data Query 方法等各种场景下使用 `SpEL`。 + +3. **Spring 表达式解析器** + + + 了解 Spring 如何解析和执行 `SpEL` 表达式是至关重要的。这包括熟悉 `SpEL` 的解析器、编译器、评估上下文等组件的工作原理和用法。 + +### 三、基本描述 + +`EvaluationContext` 接口是 Spring Framework 中的一个关键接口,用于在运行时对 Spring 表达式语言(`SpEL`)表达式进行评估和处理。它提供了一个环境,用于管理 `SpEL` 表达式中的变量、函数、类型信息和其他上下文,以便在表达式求值时可以访问和操作这些信息。通过 `EvaluationContext`,我们可以定义和控制 `SpEL` 表达式的求值上下文,从而实现对应用程序对象图的动态访问和操作,以及实现诸如动态过滤、排序、计算等功能。 + +### 四、主要功能 + +1. **管理变量** + + `EvaluationContext` 允许在 `SpEL` 表达式中定义和使用变量。它提供了方法来设置和获取变量的值,使得在表达式求值时可以访问这些变量。 + +2. **管理函数** + + + 除了支持基本的运算符和操作之外,`SpEL` 还可以调用自定义函数。`EvaluationContext` 提供了注册和管理函数的方法,以便在表达式中调用这些函数。 + +3. **类型转换和类型检查** + + + 在 `SpEL` 表达式求值过程中,可能涉及到不同类型的数据操作,如类型转换和类型检查。`EvaluationContext` 提供了方法来执行这些操作,确保表达式中的操作可以正确执行。 + +4. **对象导航和方法调用** + + + `EvaluationContext` 提供了方法来执行对象导航和方法调用。这使得在 `SpEL` 表达式中可以直接访问对象的属性和方法,从而实现对应用程序对象图的动态访问和操作。 + +5. **安全性设置** + + + `EvaluationContext` 允许设置安全性相关的属性,如是否允许访问私有字段和方法、是否启用安全访问等,以确保表达式的安全性。 + +### 五、接口源码 + + `EvaluationContext` 接口提供了 `SpEL` 表达式的评估上下文,用于支持在运行时对 `SpEL` 表达式进行求值和处理。其中,`EvaluationContext` 接口包括获取和设置根对象、获取属性访问器、构造函数解析器、方法解析器、bean 解析器等组件的方法,这些组件在表达式求值过程中起着重要的作用。此外,接口还提供了类型定位器、类型转换器、类型比较器和运算符重载器等功能,用于处理表达式中的类型转换、类型比较和运算符重载。最后,接口允许设置和查找命名变量,使得在表达式求值过程中可以动态地引用和修改变量值。综合来看,`EvaluationContext` 接口为 `SpEL` 表达式提供了必要的运行时环境和支持,使得我们能够灵活地处理和求值表达式。 + +```java +/** + * 表达式在评估上下文中执行。在表达式评估过程中遇到引用时,将在此上下文中解析这些引用。 + * + *

有一个此 EvaluationContext 接口的默认实现: + * {@link org.springframework.expression.spel.support.StandardEvaluationContext},可以进行扩展,而不必手动实现所有内容。 + * + * @author Andy Clement + * @author Juergen Hoeller + * @since 3.0 + */ +public interface EvaluationContext { + + /** + * 返回默认的根上下文对象,对未限定的属性/方法等应进行解析的对象。 + * 在评估表达式时可以覆盖此对象。 + */ + TypedValue getRootObject(); + + /** + * 返回一个访问器列表,依次询问以读取/写入属性。 + */ + List getPropertyAccessors(); + + /** + * 返回一个解析器列表,依次询问以查找构造函数。 + */ + List getConstructorResolvers(); + + /** + * 返回一个解析器列表,依次询问以查找方法。 + */ + List getMethodResolvers(); + + /** + * 返回一个 bean 解析器,可以按名称查找 bean。 + */ + @Nullable + BeanResolver getBeanResolver(); + + /** + * 返回一个类型定位器,可用于按短名称或完全限定名称查找类型。 + */ + TypeLocator getTypeLocator(); + + /** + * 返回一个类型转换器,可以将一个值从一种类型转换(或强制转换)为另一种类型。 + */ + TypeConverter getTypeConverter(); + + /** + * 返回一个类型比较器,用于比较对象对是否相等。 + */ + TypeComparator getTypeComparator(); + + /** + * 返回一个运算符重载器,可能支持超出标准类型集的数学运算。 + */ + OperatorOverloader getOperatorOverloader(); + + /** + * 将此评估上下文中的命名变量设置为指定的值。 + * @param name 要设置的变量名称 + * @param value 要放置在变量中的值 + */ + void setVariable(String name, @Nullable Object value); + + /** + * 在此评估上下文中查找命名变量。 + * @param name 要查找的变量名称 + * @return 变量的值,如果未找到则返回 {@code null} + */ + @Nullable + Object lookupVariable(String name); + +} +``` + +### 六、主要实现 + +1. **StandardEvaluationContext** + + + `StandardEvaluationContext` 是 SpEL 默认的评估上下文实现,提供了对变量、函数、类型转换、类型检查等基本功能的支持。它是最常用的评估上下文实现,适用于大多数的 SpEL 使用场景。`StandardEvaluationContext` 也是其他上下文实现的基础。 + +2. **SimpleEvaluationContext** + + + `SimpleEvaluationContext` 是 `StandardEvaluationContext` 的另一个简化版本,它减少了一些不太常用的功能,从而提供了更轻量级的评估上下文实现。虽然功能相对较少,但是对于某些简单的应用场景或者对性能要求较高的场景,使用 `SimpleEvaluationContext` 可能是更合适的选择。 + +3. **CacheEvaluationContext** + + + `CacheEvaluationContext` 是 `StandardEvaluationContext` 的子类,它在标准的评估上下文的基础上增加了对表达式求值结果的缓存支持。这意味着对于相同的表达式,如果输入不变,将不会重复计算结果,而是直接返回缓存的值,从而提高了性能。这对于那些计算开销较大的表达式可以提供显著的性能提升。 + +4. **MethodBasedEvaluationContext** + + + `MethodBasedEvaluationContext` 是 `StandardEvaluationContext` 的另一个子类,它专门用于在表达式中调用方法。与标准评估上下文不同的是,`MethodBasedEvaluationContext` 允许将目标对象的方法暴露给 `SpEL` 表达式,并在表达式中进行调用。这使得在 `SpEL` 表达式中可以直接访问对象的方法,从而更加灵活地处理数据。 + +### 七、最佳实践 + +使用 Spring Expression Language(`SpEL`)的 `EvaluationContext` 接口及其实现类 `StandardEvaluationContext` 来设置根对象、设置变量以及获取属性访问器、构造函数解析器、方法解析器、bean 解析器等上下文相关的信息。其中,通过创建一个自定义的根对象类 `MyRootObject` 并将其作为参数传递给 `StandardEvaluationContext` 构造函数来设置根对象,然后演示了如何设置变量、获取属性访问器、构造函数解析器等。 + +```java +public class EvaluationContextDemo { + public static void main(String[] args) { + // 创建评估上下文 + EvaluationContext context = new StandardEvaluationContext(new MyRootObject("Root Data")); + + // 获取根对象 + TypedValue root = context.getRootObject(); + System.out.println("根对象: " + root.getValue()); + + // 设置变量 + context.setVariable("name", "spring-reading"); + System.out.println("变量'name'的值: " + context.lookupVariable("name")); + + // 获取属性访问器 + List propertyAccessors = context.getPropertyAccessors(); + System.out.println("属性访问器: " + propertyAccessors); + + // 获取构造函数解析器 + List constructorResolvers = context.getConstructorResolvers(); + System.out.println("构造函数解析器: " + constructorResolvers); + + // 获取方法解析器 + List methodResolvers = context.getMethodResolvers(); + System.out.println("方法解析器: " + methodResolvers); + + // 获取 bean 解析器 + BeanResolver beanResolver = context.getBeanResolver(); + System.out.println("bean 解析器: " + beanResolver); + + // 获取类型定位器 + TypeLocator typeLocator = context.getTypeLocator(); + System.out.println("类型定位器: " + typeLocator); + + // 获取类型转换器 + TypeConverter typeConverter = context.getTypeConverter(); + System.out.println("类型转换器: " + typeConverter); + + // 获取类型比较器 + TypeComparator typeComparator = context.getTypeComparator(); + System.out.println("类型比较器: " + typeComparator); + + // 获取运算符重载器 + OperatorOverloader operatorOverloader = context.getOperatorOverloader(); + System.out.println("运算符重载器: " + operatorOverloader); + } + + // 定义根对象的类 + static class MyRootObject { + private String data; + + public MyRootObject(String data) { + this.data = data; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + } +} +``` + +运行结果发现,通过 `StandardEvaluationContext` 设置的评估上下文中的各种信息:根对象是 `EvaluationContextDemo` 类中定义的 `MyRootObject` 类的实例,变量 `'name'` 的值为 `'spring-reading'`,同时显示了使用的属性访问器、构造函数解析器、方法解析器、类型定位器、类型转换器、类型比较器以及运算符重载器等组件的具体实现类。 + +```properties +根对象: com.xcs.spring.EvaluationContextDemo$MyRootObject@735b478 +变量'name'的值: spring-reading +属性访问器: [org.springframework.expression.spel.support.ReflectivePropertyAccessor@13c78c0b] +构造函数解析器: [org.springframework.expression.spel.support.ReflectiveConstructorResolver@7ca48474] +方法解析器: [org.springframework.expression.spel.support.ReflectiveMetho + dResolver@b97c004] +bean 解析器: null +类型定位器: org.springframework.expression.spel.support.StandardTypeLocator@51565ec2 +类型转换器: org.springframework.expression.spel.support.StandardTypeConverter@1c3a4799 +类型比较器: org.springframework.expression.spel.support.StandardTypeComparator@131276c2 +运算符重载器: org.springframework.expression.spel.support.StandardOperatorOverloader@26aa12dd +``` + +### 八、与其他组件的关系 + +1. **StandardEvaluationContext** + + + `StandardEvaluationContext` 是 `EvaluationContext` 接口的一个实现类,它提供了一个标准的评估上下文实现,用于在 SpEL 表达式求值过程中管理上下文信息。 + +2. **TypedValue** + + + `TypedValue` 类用于包装表达式求值的结果,它与 `EvaluationContext` 接口一起工作,用于在表达式求值过程中传递和处理值。 + +3. **PropertyAccessor**、**ConstructorResolver**、**MethodResolver**、**BeanResolver** + + + 这些接口和类都与 `EvaluationContext` 接口相关联,用于支持 `SpEL` 表达式中属性、构造函数、方法和 bean 的解析和访问。 + +4. **TypeLocator**、**TypeConverter**、**TypeComparator**、**OperatorOverloader** + + + 这些接口和类也与 `EvaluationContext` 接口相关联,用于支持 `SpEL` 表达式中类型相关的操作和比较。 + +5. **ExpressionParser**、**Expression** + + + `ExpressionParser` 接口用于解析表达式字符串并返回 `Expression` 对象,而 `Expression` 接口用于表示已解析的表达式,它们与 `EvaluationContext` 接口一起工作,用于实际的表达式求值过程。 + +### 九、常见问题 + +1. **如何创建和使用 `EvaluationContext` 实例?** + + - 通过 `StandardEvaluationContext` 或其子类来创建 `EvaluationContext` 实例,并使用其方法设置根对象、变量等上下文信息,然后将其传递给表达式求值器进行表达式求值。 + +2. **如何设置根对象和变量?** + + - 使用 `setRootObject` 方法设置根对象,使用 `setVariable` 方法设置变量。根对象是表达式求值的起点,而变量则提供了在表达式求值过程中使用的上下文信息。 + +3. **`EvaluationContext` 接口的实现类有哪些?它们有何不同?** + + - `EvaluationContext` 实现类包括 `StandardEvaluationContext`、`SimpleEvaluationContext` 等。它们在功能复杂度、性能等方面可能有所不同,我们可以根据具体需求选择合适的实现类。 + +4. **`EvaluationContext` 与 `ExpressionParser`、`Expression` 之间的关系是什么?** + + - `ExpressionParser` 用于解析表达式字符串并返回 `Expression` 对象,而 `EvaluationContext` 则用于在表达式求值过程中提供上下文信息。`Expression` 对象与 `EvaluationContext` 实例一起用于实际的表达式求值过程。 + +5. **`EvaluationContext` 如何与 SpEL 中的属性、方法、构造函数解析器等组件协作?** + + - `EvaluationContext` 可以通过其方法获取属性访问器、方法解析器、构造函数解析器等组件,并在表达式求值过程中使用它们来解析和访问属性、方法、构造函数等。 + +6. **如何处理表达式求值过程中可能出现的异常?** + + - 在表达式求值过程中可能出现各种异常,如语法错误、类型转换错误等。可以通过捕获异常并进行适当的处理来处理这些异常,以确保程序的稳定性和健壮性。 + diff --git a/spring-spel/spring-spel-evaluationContext/pom.xml b/spring-spel/spring-spel-evaluationContext/pom.xml new file mode 100644 index 0000000..2897858 --- /dev/null +++ b/spring-spel/spring-spel-evaluationContext/pom.xml @@ -0,0 +1,16 @@ + + + + com.xcs.spring + spring-spel + 0.0.1-SNAPSHOT + + + 4.0.0 + spring-spel-evaluationContext + + + + \ No newline at end of file diff --git a/spring-spel/spring-spel-evaluationContext/src/main/java/com/xcs/spring/EvaluationContextDemo.java b/spring-spel/spring-spel-evaluationContext/src/main/java/com/xcs/spring/EvaluationContextDemo.java new file mode 100644 index 0000000..08abc1a --- /dev/null +++ b/spring-spel/spring-spel-evaluationContext/src/main/java/com/xcs/spring/EvaluationContextDemo.java @@ -0,0 +1,70 @@ +package com.xcs.spring; + +import org.springframework.expression.*; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.List; + +public class EvaluationContextDemo { + public static void main(String[] args) { + // 创建评估上下文 + EvaluationContext context = new StandardEvaluationContext(new MyRootObject("Root Data")); + + // 获取根对象 + TypedValue root = context.getRootObject(); + System.out.println("根对象: " + root.getValue()); + + // 设置变量 + context.setVariable("name", "John"); + System.out.println("变量'name'的值: " + context.lookupVariable("name")); + + // 获取属性访问器 + List propertyAccessors = context.getPropertyAccessors(); + System.out.println("属性访问器: " + propertyAccessors); + + // 获取构造函数解析器 + List constructorResolvers = context.getConstructorResolvers(); + System.out.println("构造函数解析器: " + constructorResolvers); + + // 获取方法解析器 + List methodResolvers = context.getMethodResolvers(); + System.out.println("方法解析器: " + methodResolvers); + + // 获取 bean 解析器 + BeanResolver beanResolver = context.getBeanResolver(); + System.out.println("bean 解析器: " + beanResolver); + + // 获取类型定位器 + TypeLocator typeLocator = context.getTypeLocator(); + System.out.println("类型定位器: " + typeLocator); + + // 获取类型转换器 + TypeConverter typeConverter = context.getTypeConverter(); + System.out.println("类型转换器: " + typeConverter); + + // 获取类型比较器 + TypeComparator typeComparator = context.getTypeComparator(); + System.out.println("类型比较器: " + typeComparator); + + // 获取运算符重载器 + OperatorOverloader operatorOverloader = context.getOperatorOverloader(); + System.out.println("运算符重载器: " + operatorOverloader); + } + + // 定义根对象的类 + static class MyRootObject { + private String data; + + public MyRootObject(String data) { + this.data = data; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + } +} diff --git a/spring-spel/spring-spel-propertyAccessor/README.md b/spring-spel/spring-spel-propertyAccessor/README.md new file mode 100644 index 0000000..719ad05 --- /dev/null +++ b/spring-spel/spring-spel-propertyAccessor/README.md @@ -0,0 +1,260 @@ +## PropertyAccessor + +- [PropertyAccessor](#propertyaccessor) + - [一、基本信息](#一基本信息) + - [二、知识储备](#二知识储备) + - [三、基本描述](#三基本描述) + - [四、主要功能](#四主要功能) + - [五、接口源码](#五接口源码) + - [六、主要实现](#六主要实现) + - [七、最佳实践](#七最佳实践) + - [八、与其他组件的关系](#八与其他组件的关系) + - [九、常见问题](#九常见问题) + +### 一、基本信息 + +✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading) + +### 二、知识储备 + +1. **Spring 表达式语言(SpEL)** + + + 了解 SpEL 的基本语法和功能,包括表达式的解析、运算符、变量、函数等。 + +2. **对象属性访问与反射机制** + + + 了解如何使用 Java 的反射机制来访问和操作对象的属性,包括获取类的字段、调用对象的方法、设置字段的值等。 + +3. **设计模式** + + + 理解常见的设计模式,如适配器模式、策略模式等,这些设计模式在实现自定义 `PropertyAccessor` 接口时可能会用到。 + +### 三、基本描述 + +`PropertyAccessor` 接口的作用在于定义了一套统一的属性访问规范,通过该接口可以实现对对象属性的读取和写入操作,使得 Spring 框架中的各个模块能够统一地访问对象的属性,从而实现更加灵活和可扩展的应用开发。通过实现这个接口,可以定制化对象属性的访问逻辑,以满足不同场景下的需求,例如在 Spring 表达式语言(SpEL)、数据绑定、AOP 编程等方面发挥作用。 + +### 四、主要功能 + +1. **属性读取** + + + 提供了 `canRead()` 方法用于判断是否可以读取指定属性,以及 `read()` 方法用于读取属性的值。这使得可以通过统一的方式从对象中获取属性值。 + +2. **属性写入** + + + 提供了 `canWrite()` 方法用于判断是否可以写入指定属性,以及 `write()` 方法用于设置属性的值。这使得可以通过统一的方式向对象中设置属性值。 + +3. **自定义属性访问逻辑** + + + 允许我们根据实际需求实现自定义的属性访问逻辑,例如通过自定义的 `PropertyAccessor` 实现类来访问对象的属性,从而实现特定的业务逻辑或行为。 + +4. **适配不同的对象结构** + + + 可以针对不同的对象结构实现不同的 `PropertyAccessor` 实现类,以适应不同类型的对象,包括 JavaBean、Map、数组等。 + +### 五、接口源码 + + `PropertyAccessor` 的接口,它用于读取和写入对象的属性。接口中包含了四个方法,分别用于判断是否能够读取属性、读取属性值、判断是否能够写入属性以及写入属性值。此外,接口中还包含了一个用于获取特定目标类数组的方法。该接口提供了一种统一的方式来访问对象的属性,使得可以实现自定义的属性访问逻辑,并能够适配不同的对象结构。 + +```java +/** + * 属性访问器能够读取(可能写入)对象的属性。 + * + *

这个接口没有限制,因此实现者可以自由地直接访问属性作为字段,或通过getter方法或其他方式访问属性。 + * + *

解析器可以选择指定一个目标类的数组,用于调用它。然而,如果从{@link #getSpecificTargetClasses()}返回{@code null},它将被调用 + * 以尝试解析所有属性引用,并有机会确定它是否可以读取或写入它们。 + * + *

属性解析器被认为是有序的,并且每个都将依次被调用。影响调用顺序的唯一规则是,在{@link #getSpecificTargetClasses()}中直接命名目标类的任何解析器 + * 将在通用解析器之前首先被调用。 + * + * @author Andy Clement + * @since 3.0 + */ +public interface PropertyAccessor { + + /** + * 返回此解析器应该被调用的类数组。 + *

返回{@code null}表示这是一个通用解析器,可以在任何类型上尝试解析属性。 + * @return 适用于此解析器的类数组(或{@code null}如果是通用解析器) + */ + @Nullable + Class[] getSpecificTargetClasses(); + + /** + * 用于确定解析器实例是否能够访问指定目标对象上的指定属性。 + * @param context 尝试进行访问的评估上下文 + * @param target 要访问属性的目标对象 + * @param name 要访问的属性的名称 + * @return 如果此解析器能够读取属性,则为true + * @throws AccessException 如果有任何问题确定是否可以读取属性 + */ + boolean canRead(EvaluationContext context, @Nullable Object target, String name) throws AccessException; + + /** + * 用于从指定的目标对象中读取属性。 + * 只有当{@link #canRead}也返回{@code true}时才能成功。 + * @param context 尝试进行访问的评估上下文 + * @param target 要访问属性的目标对象 + * @param name 要访问的属性的名称 + * @return 包装读取的属性值和其类型描述符的TypedValue对象 + * @throws AccessException 如果有任何问题访问属性值 + */ + TypedValue read(EvaluationContext context, @Nullable Object target, String name) throws AccessException; + + /** + * 用于确定解析器实例是否能够向指定目标对象上的指定属性写入。 + * @param context 尝试进行访问的评估上下文 + * @param target 要访问属性的目标对象 + * @param name 要访问的属性的名称 + * @return 如果此解析器能够写入属性,则为true + * @throws AccessException 如果有任何问题确定是否可以写入属性 + */ + boolean canWrite(EvaluationContext context, @Nullable Object target, String name) throws AccessException; + + /** + * 用于向指定目标对象的属性写入。 + * 只有当{@link #canWrite}也返回{@code true}时才能成功。 + * @param context 尝试进行访问的评估上下文 + * @param target 要访问属性的目标对象 + * @param name 要访问的属性的名称 + * @param newValue 属性的新值 + * @throws AccessException 如果有任何问题写入属性值 + */ + void write(EvaluationContext context, @Nullable Object target, String name, @Nullable Object newValue) + throws AccessException; + +} +``` + +### 六、主要实现 + +1. **BeanExpressionContextAccessor** + + + 允许在表达式中访问特定的对象和属性。通过 `BeanExpressionContextAccessor`,可以在 SpEL 表达式中直接访问上下文中的对象属性,这在某些场景下非常有用,例如在 Spring 的 `@Value` 注解中使用 SpEL 表达式读取配置属性。 + +2. **BeanFactoryAccessor** + + + 允许在 SpEL 表达式中访问 Spring `BeanFactory` 中注册的 Bean 对象的属性。`BeanFactory` 是 Spring IoC 容器的核心接口,用于管理和创建 Bean。通过 `BeanFactoryAccessor`,可以在 SpEL 表达式中访问 IoC 容器中注册的 Bean,读取和设置其属性值,这为在 SpEL 中访问 Spring Bean 提供了便利。 + +3. **CompilablePropertyAccessor** + + + 允许对属性访问进行优化以提高性能。通过编译能力,可以在运行时对属性访问逻辑进行优化,从而减少不必要的计算和提高执行效率,这在某些性能要求较高的场景下非常有用。 + +4. **DataBindingPropertyAccessor** + + + 允许在 Spring 应用程序中读取和写入属性。数据绑定是将用户输入绑定到后端数据模型的过程,在 Web 应用程序中广泛应用。`DataBindingPropertyAccessor` 提供了方便的方式来读取和设置对象的属性值,用于处理数据绑定过程中的属性访问需求。 + +5. **EnvironmentAccessor** + + + `EnvironmentAccessor` 用于从 Spring 环境中访问属性,例如读取配置文件中的属性值。Spring 的环境抽象提供了一种统一的方式来访问应用程序的环境属性,包括系统属性、环境变量、配置文件等。通过 `EnvironmentAccessor`,可以在 SpEL 表达式中直接访问 Spring 环境中的属性值,从而实现动态的配置和属性注入。 + +6. **JspPropertyAccessor** + + + 允许在 JSP 页面中使用 SpEL 表达式,并在 JSP 标签中访问对象的属性。JSP 是一种常见的 Web 视图技术,与 SpEL 结合使用可以实现更加灵活和动态的页面渲染。通过在 JSP 中使用 SpEL 表达式,并在自定义标签(如 `eval` 标签)内访问对象的属性,可以实现更加灵活和可配置的页面逻辑。 + +7. **MapAccessor** + + + `MapAccessor` 用于在 SpEL 表达式中直接访问 Map 对象中的键值对。Map 是一种常见的数据结构,用于存储键值对的集合。通过 `MapAccessor`,可以在 SpEL 表达式中直接访问 Map 对象中的键值对,读取和设置其属性值,这为在 SpEL 中操作 Map 提供了便利。 + +8. **OptimalPropertyAccessor** + + + `OptimalPropertyAccessor` 提供了属性访问的优化实现,通常在 `ReflectivePropertyAccessor` 内部使用,用于提高属性访问的性能。通过对属性访问逻辑的优化,可以减少不必要的计算和提高执行效率,从而更加高效地访问对象的属性值。 + +### 七、最佳实践 + +使用 `ReflectivePropertyAccessor` 对象来访问对象的属性。首先,创建了一个 `MyBean` 对象,并设置了其属性值。然后,创建了一个 `StandardEvaluationContext` 对象作为属性访问的上下文。接着,通过 `canRead()` 方法判断是否可以读取对象的属性,如果可以则使用 `read()` 方法读取属性值,并通过 `canWrite()` 方法判断是否可以写入属性,如果可以则使用 `write()` 方法更新属性值。最后,输出了更新后的属性值。 + +```java +public class PropertyAccessorDemo { + public static void main(String[] args) throws AccessException { + // 创建 ReflectivePropertyAccessor 对象 + ReflectivePropertyAccessor propertyAccessor = new ReflectivePropertyAccessor(); + + // 创建一个对象,我们将在表达式中访问它的属性 + MyBean myBean = new MyBean(); + myBean.setName("spring-reading"); + + // 创建一个 EvaluationContext 对象 + StandardEvaluationContext context = new StandardEvaluationContext(); + + // 演示 read 方法 + if (propertyAccessor.canRead(context, myBean, "name")) { + System.out.println("Name: " + propertyAccessor.read(context, myBean, "name")); + } + + // 演示 write 方法 + if (propertyAccessor.canWrite(context, myBean, "name")) { + propertyAccessor.write(context, myBean, "name", "spring-reading-xcs"); + System.out.println("Updated Name: " + myBean.getName()); + } + } +} +``` + + `MyBean` 类定义了一个简单的 Java Bean,具有一个名为 `name` 的私有字段和相应的 getter 和 setter 方法。 + +```java +public class MyBean { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} +``` + +运行结果发现,在输出结果中,“Name” 表示读取到的属性值,而 “Updated Name” 则表示经过写入后的新属性值。 + +```properties +Name: TypedValue: 'spring-reading' of [java.lang.String] +Updated Name: spring-reading-xcs +``` + +### 八、与其他组件的关系 + +1. **Spring 表达式语言(SpEL)** + + + 在 SpEL 中,`PropertyAccessor` 接口被用于访问对象的属性。SpEL 提供了一种在运行时动态求值表达式的机制,通过 `PropertyAccessor` 接口可以实现对对象属性的读写操作。 + +2. **Spring 数据绑定** + + + 在 Spring 中,数据绑定是一种常见的操作,用于将用户提交的数据绑定到后端数据模型上。`PropertyAccessor` 接口提供了一种统一的方式来访问对象的属性,可以在数据绑定过程中使用。 + +3. **Spring AOP 编程** + + + 在 Spring 的面向切面编程(AOP)中,`PropertyAccessor` 接口可以用于访问被增强对象的属性。通过 AOP 可以实现对被增强对象的属性进行拦截、修改等操作。 + +4. **Spring IOC 容器** + + + 在 Spring 的控制反转(IoC)容器中,`PropertyAccessor` 接口可以用于访问注册在容器中的 Bean 对象的属性。通过 IoC 容器,可以方便地管理和访问对象的属性。 + +5. **其他自定义组件** + + + 除了以上提到的场景之外,`PropertyAccessor` 接口还可以被自定义组件使用。例如,在自定义的框架或库中,可以使用 `PropertyAccessor` 接口来实现对对象属性的访问操作,以实现特定的功能或逻辑。 + +### 九、常见问题 + +1. **属性访问权限问题** + + + 在使用 `PropertyAccessor` 接口时,可能会遇到对象的属性访问权限不足的问题,导致无法读取或写入属性。这可能涉及到对象的访问控制和权限设置。 + +2. **属性命名问题** + + + 在访问对象的属性时,可能会出现属性命名不一致的问题,例如大小写不匹配、拼写错误等,导致无法正确访问属性。 + +3. **属性类型转换问题** + + + 在进行属性读取或写入时,可能会遇到属性类型转换失败的问题,例如尝试将一个字符串值赋给一个整数类型的属性,导致转换异常。 + +4. **上下文环境配置问题** + + + 在使用 `PropertyAccessor` 接口时,需要提供一个合适的上下文环境(如 `EvaluationContext`),可能会出现配置错误或环境设置不当的问题,导致属性访问失败。 + +5. **异常处理问题** + + + 在属性访问过程中,可能会出现各种异常情况,例如空指针异常、访问权限异常等,需要进行适当的异常处理以保证程序的稳定性和可靠性。 \ No newline at end of file diff --git a/spring-spel/spring-spel-propertyAccessor/pom.xml b/spring-spel/spring-spel-propertyAccessor/pom.xml new file mode 100644 index 0000000..67a2419 --- /dev/null +++ b/spring-spel/spring-spel-propertyAccessor/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.xcs.spring + spring-spel + 0.0.1-SNAPSHOT + + + spring-spel-propertyAccessor + + + 11 + 11 + UTF-8 + + + \ No newline at end of file diff --git a/spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/MyBean.java b/spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/MyBean.java new file mode 100644 index 0000000..d5f6d2d --- /dev/null +++ b/spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/MyBean.java @@ -0,0 +1,15 @@ +package com.xcs.spring; + +public class MyBean { + + private String name; + + // Getters and setters + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/PropertyAccessorDemo.java b/spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/PropertyAccessorDemo.java new file mode 100644 index 0000000..99fe568 --- /dev/null +++ b/spring-spel/spring-spel-propertyAccessor/src/main/java/com/xcs/spring/PropertyAccessorDemo.java @@ -0,0 +1,37 @@ +package com.xcs.spring; + +import org.springframework.expression.AccessException; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.ReflectivePropertyAccessor; +import org.springframework.expression.spel.support.SimpleEvaluationContext; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.ArrayList; +import java.util.List; + +public class PropertyAccessorDemo { + public static void main(String[] args) throws AccessException { + // 创建 ReflectivePropertyAccessor 对象 + ReflectivePropertyAccessor propertyAccessor = new ReflectivePropertyAccessor(); + + // 创建一个对象,我们将在表达式中访问它的属性 + MyBean myBean = new MyBean(); + myBean.setName("spring-reading"); + + // 创建一个 EvaluationContext 对象 + StandardEvaluationContext context = new StandardEvaluationContext(); + + // 演示 read 方法 + if (propertyAccessor.canRead(context, myBean, "name")) { + System.out.println("Name: " + propertyAccessor.read(context, myBean, "name")); + } + + // 演示 write 方法 + if (propertyAccessor.canWrite(context, myBean, "name")) { + propertyAccessor.write(context, myBean, "name", "spring-reading-xcs"); + System.out.println("Updated Name: " + myBean.getName()); + } + } +}