diff --git a/README-FUTURE.md b/README-FUTURE.md
index 2a9b30b..63616ac 100644
--- a/README-FUTURE.md
+++ b/README-FUTURE.md
@@ -75,6 +75,7 @@
- Bean定义读取与扫描
- XmlBeanDefinitionReader
- PropertiesBeanDefinitionReader
+ - GroovyBeanDefinitionReader
- AnnotatedBeanDefinitionReader
- ClassPathBeanDefinitionScanner
- Bean定义导入与组合
diff --git a/spring-beans/pom.xml b/spring-beans/pom.xml
index 3c99df5..f6ca43c 100644
--- a/spring-beans/pom.xml
+++ b/spring-beans/pom.xml
@@ -18,6 +18,7 @@
spring-bean-beanDefinitionRegistry
spring-bean-xmlBeanDefinitionReader
spring-bean-propertiesBeanDefinitionReader
+ spring-bean-groovyBeanDefinitionReader
\ No newline at end of file
diff --git a/spring-beans/spring-bean-groovyBeanDefinitionReader/README.md b/spring-beans/spring-bean-groovyBeanDefinitionReader/README.md
new file mode 100644
index 0000000..0b5ff8d
--- /dev/null
+++ b/spring-beans/spring-bean-groovyBeanDefinitionReader/README.md
@@ -0,0 +1,354 @@
+## GroovyBeanDefinitionReader
+
+- [GroovyBeanDefinitionReader](#groovybeandefinitionreader)
+ - [一、知识储备](#一知识储备)
+ - [二、基本描述](#二基本描述)
+ - [三、主要功能](#三主要功能)
+ - [四、最佳实践](#四最佳实践)
+ - [五、源码分析](#五源码分析)
+ - [六、与其他组件的关系](#六与其他组件的关系)
+ - [七、常见问题](#七常见问题)
+
+### 一、知识储备
+
+1. **Groovy 语言**
+ + 了解 Groovy 语言的基础语法和特性非常重要,因为 `GroovyBeanDefinitionReader` 用于解析 Groovy 脚本文件。我们应该理解 Groovy 的闭包、动态类型、元编程等概念。
+2. **Spring 配置**
+ + 了解如何配置 Spring 应用程序上下文,包括 XML 配置、注解配置以及使用 Groovy 脚本文件配置的方式。我们应该知道如何定义和配置 Spring Bean,并了解 Bean 的作用域、生命周期等。
+3. **Groovy 脚本编写**
+ + 学习如何编写 Groovy 脚本以定义和配置 Spring Bean。这可能包括创建 Bean 定义、引入其他类和资源、执行自定义逻辑等。
+4. **Spring 脚本支持**
+ + 了解 Spring 如何支持不同类型的配置方式,包括 XML、注解和 Groovy 脚本,以及它们之间的差异和优缺点。
+
+### 二、基本描述
+
+`GroovyBeanDefinitionReader` 是一个用于读取 Groovy 脚本文件并将其解析为 Spring 的 Bean 定义的组件。它是 Spring Framework 的一部分,主要用于支持将 Groovy 脚本用于配置应用程序上下文中的 Bean。
+
+### 三、主要功能
+
+1. **加载 Groovy 脚本文件**
+ + `GroovyBeanDefinitionReader` 允许我们加载 Groovy 脚本文件,这些脚本文件可以包含 Spring Bean 的定义以及其他配置信息。
+2. **解析 Bean 定义**
+ + 它解析 Groovy 脚本中定义的 Bean,包括 Bean 的类型、属性、依赖关系等信息,并将其转化为 Spring Bean 定义。
+3. **注册 Bean 定义**
+ + 解析后的 Bean 定义将被注册到 Spring 容器中,使这些 Bean 可以在应用程序中被管理和使用。
+4. **支持依赖注入**
+ + `GroovyBeanDefinitionReader` 支持在 Groovy 脚本中使用依赖注入,允许我们引用其他 Bean 或资源,并将它们注入到正在创建的 Bean 中。
+5. **支持自定义逻辑**
+ + 我们可以在 Groovy 脚本中编写自定义逻辑来动态计算 Bean 的属性值,从而实现更复杂的配置。
+6. **支持Bean的作用域和生命周期**
+ + 我们可以在 Groovy 脚本中指定 Bean 的作用域(例如单例或原型)以及 Bean 的生命周期回调方法(例如初始化方法和销毁方法)。
+
+### 四、最佳实践
+
+首先通过`GroovyBeanDefinitionReader`加载和注册了Spring Bean定义,从`my-beans.groovy` Groovy文件中创建了`MyService` Bean实例,并通过该Bean打印一条消息,。
+
+```java
+public class GroovyBeanDefinitionReaderDemo {
+
+ public static void main(String[] args) {
+ // 创建一个 Spring IOC 容器
+ DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
+
+ // 创建一个 GroovyBeanDefinitionReader
+ GroovyBeanDefinitionReader reader = new GroovyBeanDefinitionReader(factory);
+
+ // 加载 Groovy 文件并注册 Bean 定义
+ reader.loadBeanDefinitions(new ClassPathResource("my-beans.groovy"));
+
+ // 获取MyService
+ MyService myService = factory.getBean(MyService.class);
+ // 打印消息
+ myService.showMessage();
+ }
+}
+```
+
+定义一个`MyService`接口
+
+```java
+public interface MyService {
+ void showMessage();
+}
+```
+
+我们在`classpath:my-beans.groovy`文件中,定义了一个名为`MyServiceImpl`的Groovy类,实现了`MyService`接口和`InitializingBean`接口,其中包含了一个`message`字段和对应的setter和getter方法,以及在初始化时会调用的`afterPropertiesSet`方法。通过`Groovy DSL`的`beans`闭包,我们定义了一个名为`myServiceImpl`的Spring Bean,指定其类型为`MyServiceImpl`,并设置了`message`属性为"`hello world`"。
+
+```groovy
+import com.xcs.spring.service.MyService
+import org.springframework.beans.factory.InitializingBean
+
+class MyServiceImpl implements MyService, InitializingBean {
+ private String message
+
+ void setMessage(String message) {
+ this.message = message
+ }
+
+ String getMessage() {
+ return message
+ }
+
+ @Override
+ void afterPropertiesSet() throws Exception {
+ System.out.println("MyServiceImpl.afterPropertiesSet")
+ }
+
+ @Override
+ void showMessage() {
+ System.out.println(message)
+ }
+}
+
+beans {
+ myServiceImpl(MyServiceImpl) {
+ message = "hello world"
+ }
+}
+```
+
+运行结果发现,我们成功创建了`myServiceImpl` Bean,并在初始化时调用了`afterPropertiesSet`方法。最后,`myServiceImpl` Bean 打印了"`hello world`"消息,这是我们在配置文件中设置的消息内容。这表明我们的`Groovy DSL`配置和Spring容器设置正常工作。
+
+```java
+MyServiceImpl.afterPropertiesSet
+hello world
+```
+
+### 五、源码分析
+
+在`org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions(location)`方法中,又调用了 `loadBeanDefinitions(encodedResource)` 方法,同时将 `resource` 包装成一个 `EncodedResource` 对象。
+
+```java
+@Override
+public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
+ return loadBeanDefinitions(new EncodedResource(resource));
+}
+```
+
+在`org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions(location,actualResources)`方法中,主要用于加载 Groovy 配置文件中的 Bean 定义。如果文件扩展名是 "`.xml`",则会委托给标准的 `XmlBeanDefinitionReader` 进行加载。否则,它使用 Groovy 脚本加载 Bean 定义,创建 `GroovyShell` 和 `Binding` 对象,通过 Groovy 脚本执行加载操作。
+
+```java
+public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
+ // 检查是否为 XML 文件,如果是,将其重定向到 "standard" XmlBeanDefinitionReader 加载。
+ String filename = encodedResource.getResource().getFilename();
+ if (StringUtils.endsWithIgnoreCase(filename, ".xml")) {
+ return this.standardXmlBeanDefinitionReader.loadBeanDefinitions(encodedResource);
+ }
+
+ // 如果不是 XML 文件,执行 Groovy Bean 定义加载。
+ if (logger.isTraceEnabled()) {
+ logger.trace("Loading Groovy bean definitions from " + encodedResource);
+ }
+
+ // 创建 Closure 对象 "beans" 用于处理 Bean 定义。
+ @SuppressWarnings("serial")
+ Closure