diff --git a/README.md b/README.md
index 19a2a83..fe5c149 100644
--- a/README.md
+++ b/README.md
@@ -84,9 +84,7 @@
- [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 实例。
- [Expression](spring-spel/spring-spel-expression/README.md): 对表达式字符串进行求值的功能,支持类型转换、获取原始字符串等操作。
@@ -99,33 +97,32 @@
- [TypeConverter](spring-spel/spring-spel-typeLocator/README.md): 类型转换功能,将表达式中的数据从一种类型转换为另一种类型。
- [TypeComparator](spring-spel/spring-spel-typeLocator/README.md): 类型比较功能,定义了比较两个对象是否相等的方法。
- [OperatorOverloader](spring-spel/spring-spel-typeLocator/README.md): 运算符重载功能,对表达式中的运算符进行自定义操作的方法。
-
- + 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工厂
+ - [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定义导入与组合
- ImportBeanDefinitionRegistrar:运行时动态注册 Bean,实现灵活配置,扩展配置类功能。
- ImportSelector:运行时动态导入配置类,实现条件选择和灵活配置。
diff --git a/spring-context/pom.xml b/spring-context/pom.xml
index 2e01b1e..5db6223 100644
--- a/spring-context/pom.xml
+++ b/spring-context/pom.xml
@@ -15,6 +15,7 @@
spring-context-classPathXmlApplicationContext
spring-context-annotationConfigApplicationContext
+ spring-context-genericApplicationContext
\ No newline at end of file
diff --git a/spring-dataops/spring-dataops-beanWrapper/pom.xml b/spring-context/spring-context-genericApplicationContext/pom.xml
similarity index 78%
rename from spring-dataops/spring-dataops-beanWrapper/pom.xml
rename to spring-context/spring-context-genericApplicationContext/pom.xml
index 8937cf1..594b8fc 100644
--- a/spring-dataops/spring-dataops-beanWrapper/pom.xml
+++ b/spring-context/spring-context-genericApplicationContext/pom.xml
@@ -3,12 +3,12 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- spring-dataops
com.xcs.spring
+ spring-context
0.0.1-SNAPSHOT
4.0.0
- spring-dataops-beanWrapper
+ spring-context-genericApplicationContext
\ No newline at end of file
diff --git a/spring-dataops/pom.xml b/spring-dataops/pom.xml
index 50b5864..cc1b022 100644
--- a/spring-dataops/pom.xml
+++ b/spring-dataops/pom.xml
@@ -13,7 +13,6 @@
pom
spring-dataops-validator
- spring-dataops-beanWrapper
spring-dataops-propertyEditor
spring-dataops-converter
spring-dataops-genericConverter
diff --git a/spring-dataops/spring-dataops-beanWrapper/README.md b/spring-dataops/spring-dataops-beanWrapper/README.md
deleted file mode 100644
index e69de29..0000000
diff --git a/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/BeanWrapperDemo.java b/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/BeanWrapperDemo.java
deleted file mode 100644
index 79e1233..0000000
--- a/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/BeanWrapperDemo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.xcs.spring;
-
-import org.springframework.beans.BeanWrapper;
-import org.springframework.beans.BeanWrapperImpl;
-
-import java.beans.*;
-
-public class BeanWrapperDemo {
-
- public static void main(String[] args) {
- // ok, let's create the director and tie it to the company:
- BeanWrapper employee = new BeanWrapperImpl(new Employee());
- employee.setPropertyValue("name", "Jim Stravinsky");
- employee.setPropertyValue("salary", "100");
-
- BeanWrapper company = new BeanWrapperImpl(new Company());
- company.setPropertyValue("name", "Some Company Inc.");
- company.setPropertyValue("managingDirector", employee.getWrappedInstance());
-
- // retrieving the salary of the managingDirector through the company
- Float salary = (Float) company.getPropertyValue("managingDirector.salary");
-
- System.out.println("salary = " + salary);
-
- System.out.println("company.getPropertyDescriptors() = " + company.getPropertyDescriptors());
-
- try {
- BeanInfo beanInfo = Introspector.getBeanInfo(Employee.class);
- PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
- System.out.println("beanInfo.getBeanDescriptor() = " + propertyDescriptors);
- } catch (IntrospectionException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/Company.java b/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/Company.java
deleted file mode 100644
index 372b65b..0000000
--- a/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/Company.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.xcs.spring;
-
-public class Company {
-
- private String name;
- private Employee managingDirector;
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Employee getManagingDirector() {
- return this.managingDirector;
- }
-
- public void setManagingDirector(Employee managingDirector) {
- this.managingDirector = managingDirector;
- }
-}
diff --git a/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/Employee.java b/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/Employee.java
deleted file mode 100644
index 38105a2..0000000
--- a/spring-dataops/spring-dataops-beanWrapper/src/main/java/com/xcs/spring/Employee.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.xcs.spring;
-
-public class Employee {
-
- private String name;
-
- private float salary;
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public float getSalary() {
- return salary;
- }
-
- public void setSalary(float salary) {
- this.salary = salary;
- }
-}
diff --git a/spring-spel/spring-spel-propertyAccessor/README.md b/spring-spel/spring-spel-propertyAccessor/README.md
index 719ad05..f79cb13 100644
--- a/spring-spel/spring-spel-propertyAccessor/README.md
+++ b/spring-spel/spring-spel-propertyAccessor/README.md
@@ -162,31 +162,21 @@ public interface PropertyAccessor {
### 七、最佳实践
-使用 `ReflectivePropertyAccessor` 对象来访问对象的属性。首先,创建了一个 `MyBean` 对象,并设置了其属性值。然后,创建了一个 `StandardEvaluationContext` 对象作为属性访问的上下文。接着,通过 `canRead()` 方法判断是否可以读取对象的属性,如果可以则使用 `read()` 方法读取属性值,并通过 `canWrite()` 方法判断是否可以写入属性,如果可以则使用 `write()` 方法更新属性值。最后,输出了更新后的属性值。
+创建了一个 SpEL 表达式解析器对象 `ExpressionParser`,然后创建了一个 `StandardEvaluationContext` 对象作为 SpEL 表达式的上下文。在上下文中设置了一个名为 `myBean` 的变量,其值为一个 `MyBean` 对象。接着,通过 `parser.parseExpression("#myBean.name")` 解析了一个 SpEL 表达式,该表达式表示访问 `myBean` 对象的 `name` 属性。最后,通过 `getValue(context, String.class)` 方法获取了属性值,并将其输出。
```java
public class PropertyAccessorDemo {
- public static void main(String[] args) throws AccessException {
- // 创建 ReflectivePropertyAccessor 对象
- ReflectivePropertyAccessor propertyAccessor = new ReflectivePropertyAccessor();
+ public static void main(String[] args) {
+ // 创建一个SpEL表达式解析器
+ ExpressionParser parser = new SpelExpressionParser();
- // 创建一个对象,我们将在表达式中访问它的属性
- MyBean myBean = new MyBean();
- myBean.setName("spring-reading");
-
- // 创建一个 EvaluationContext 对象
StandardEvaluationContext context = new StandardEvaluationContext();
+ context.setVariable("myBean",new MyBean("spring-reading"));
- // 演示 read 方法
- if (propertyAccessor.canRead(context, myBean, "name")) {
- System.out.println("Name: " + propertyAccessor.read(context, myBean, "name"));
- }
+ // 解析SpEL表达式,并使用构造函数实例化对象
+ String name = parser.parseExpression("#myBean.name").getValue(context, String.class);
- // 演示 write 方法
- if (propertyAccessor.canWrite(context, myBean, "name")) {
- propertyAccessor.write(context, myBean, "name", "spring-reading-xcs");
- System.out.println("Updated Name: " + myBean.getName());
- }
+ System.out.println("name = " + name);
}
}
```
@@ -198,6 +188,10 @@ public class MyBean {
private String name;
+ public MyBean(String name) {
+ this.name = name;
+ }
+
public String getName() {
return name;
}
@@ -205,14 +199,20 @@ public class MyBean {
public void setName(String name) {
this.name = name;
}
+
+ @Override
+ public String toString() {
+ return "MyBean{" +
+ "name='" + name + '\'' +
+ '}';
+ }
}
```
-运行结果发现,在输出结果中,“Name” 表示读取到的属性值,而 “Updated Name” 则表示经过写入后的新属性值。
+运行结果,通过 SpEL 表达式解析器访问了对象的属性,并得到了属性值 "spring-reading"。
```properties
-Name: TypedValue: 'spring-reading' of [java.lang.String]
-Updated Name: spring-reading-xcs
+name = spring-reading
```
### 八、与其他组件的关系
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
index d5f6d2d..502a4d3 100644
--- 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
@@ -2,6 +2,10 @@ package com.xcs.spring;
public class MyBean {
+ public MyBean(String name) {
+ this.name = name;
+ }
+
private String name;
// Getters and setters
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
index 99fe568..44957dc 100644
--- 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
@@ -12,26 +12,16 @@ import java.util.ArrayList;
import java.util.List;
public class PropertyAccessorDemo {
- public static void main(String[] args) throws AccessException {
- // 创建 ReflectivePropertyAccessor 对象
- ReflectivePropertyAccessor propertyAccessor = new ReflectivePropertyAccessor();
+ public static void main(String[] args) {
+ // 创建一个SpEL表达式解析器
+ ExpressionParser parser = new SpelExpressionParser();
- // 创建一个对象,我们将在表达式中访问它的属性
- MyBean myBean = new MyBean();
- myBean.setName("spring-reading");
-
- // 创建一个 EvaluationContext 对象
StandardEvaluationContext context = new StandardEvaluationContext();
+ context.setVariable("myBean",new MyBean("spring-reading"));
- // 演示 read 方法
- if (propertyAccessor.canRead(context, myBean, "name")) {
- System.out.println("Name: " + propertyAccessor.read(context, myBean, "name"));
- }
+ // 解析SpEL表达式,并使用构造函数实例化对象
+ String name = parser.parseExpression("#myBean.name").getValue(context, String.class);
- // 演示 write 方法
- if (propertyAccessor.canWrite(context, myBean, "name")) {
- propertyAccessor.write(context, myBean, "name", "spring-reading-xcs");
- System.out.println("Updated Name: " + myBean.getName());
- }
+ System.out.println("name = " + name);
}
}