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 76% 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); } }