From 81ab090bbe177ac0185273cb3a9bf32759714d28 Mon Sep 17 00:00:00 2001 From: xuchengsheng Date: Mon, 9 Oct 2023 22:48:12 +0800 Subject: [PATCH] =?UTF-8?q?spring-annotation-dependsOn=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=9C=80=E4=BD=B3=E5=AE=9E=E8=B7=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring-annotation-dependsOn/README.md | 54 +++++++++++++++++++ .../com/xcs/spring/DependsOnApplication.java | 1 + .../main/java/com/xcs/spring/bean/BeanA.java | 19 +++++++ .../main/java/com/xcs/spring/bean/BeanB.java | 19 +++++++ .../main/java/com/xcs/spring/bean/BeanC.java | 19 +++++++ .../com/xcs/spring/bean/ClassBeanFirst.java | 16 ------ .../com/xcs/spring/bean/ClassBeanSecond.java | 14 ----- .../com/xcs/spring/bean/MethodBeanFirst.java | 11 ---- .../com/xcs/spring/bean/MethodBeanSecond.java | 11 ---- .../xcs/spring/config/MyConfiguration.java | 19 ++++--- 10 files changed, 124 insertions(+), 59 deletions(-) create mode 100644 spring-annotation/spring-annotation-dependsOn/README.md create mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanA.java create mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanB.java create mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanC.java delete mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanFirst.java delete mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanSecond.java delete mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanFirst.java delete mode 100644 spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanSecond.java diff --git a/spring-annotation/spring-annotation-dependsOn/README.md b/spring-annotation/spring-annotation-dependsOn/README.md new file mode 100644 index 0000000..2b58a78 --- /dev/null +++ b/spring-annotation/spring-annotation-dependsOn/README.md @@ -0,0 +1,54 @@ +## @DependsOn + +### 一、注解描述 + +`@DependsOn`注解,用于定义 Bean 初始化顺序。有时,你可能会碰到某些 Bean 需要在其他 Bean 之前被初始化的情况。在这种情况下,我们可以使用 `@DependsOn` 注解来明确指定 Bean 的初始化顺序。 + +### 二、注解源码 + +```java +/** + * 当前bean所依赖的其他bean。任何指定的bean都保证在这个bean之前被容器创建。 + * 在少数情况下使用,当一个bean不通过属性或构造函数参数明确地依赖于另一个bean, + * 而是依赖于另一个bean的初始化的副作用时。 + * + * depends-on 声明既可以指定初始化时的依赖,又可以在单例bean的情况下,指定对应的销毁时的依赖。 + * 定义了 depends-on 关系的依赖bean会首先被销毁,然后再销毁给定的bean。 + * 因此,depends-on 声明也可以控制关闭顺序。 + * + * 可以在直接或间接使用 org.springframework.stereotype.Component 注解的任何类上, + * 或在使用 Bean 注解的方法上使用。 + * + * 在类级别使用 DependsOn 在未使用组件扫描的情况下不会产生任何效果。 + * 如果通过XML声明了使用 DependsOn 注解的类,DependsOn 注解的元数据会被忽略, + * 而 会被考虑。 + * + * @author Juergen Hoeller + * @since 3.0 + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DependsOn { + + // 定义当前bean所依赖的其他bean的名称。 + String[] value() default {}; + +} +``` + +### 三、主要功能 + +### 四、最佳实践 + +### 五、时序图 + +### 六、源码分析 + +### 七、注意事项 + +### 八、总结 + +#### 8.1、最佳实践总结 + +#### 8.2、源码分析总结 \ No newline at end of file diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/DependsOnApplication.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/DependsOnApplication.java index fd7ee10..dcd0151 100644 --- a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/DependsOnApplication.java +++ b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/DependsOnApplication.java @@ -11,5 +11,6 @@ public class DependsOnApplication { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class); + context.close(); } } diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanA.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanA.java new file mode 100644 index 0000000..fbf039a --- /dev/null +++ b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanA.java @@ -0,0 +1,19 @@ +package com.xcs.spring.bean; + +import org.springframework.beans.factory.DisposableBean; + +/** + * @author 林雷 + * @date 2023年10月09日 16时45分 + **/ +public class BeanA implements DisposableBean { + + public BeanA() { + System.out.println("BeanA Initialized"); + } + + @Override + public void destroy() throws Exception { + System.out.println("BeanA Destroyed"); + } +} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanB.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanB.java new file mode 100644 index 0000000..894735e --- /dev/null +++ b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanB.java @@ -0,0 +1,19 @@ +package com.xcs.spring.bean; + +import org.springframework.beans.factory.DisposableBean; + +/** + * @author 林雷 + * @date 2023年10月09日 16时46分 + **/ +public class BeanB implements DisposableBean { + + public BeanB() { + System.out.println("BeanB Initialized"); + } + + @Override + public void destroy() throws Exception { + System.out.println("BeanB Destroyed"); + } +} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanC.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanC.java new file mode 100644 index 0000000..1553f54 --- /dev/null +++ b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/BeanC.java @@ -0,0 +1,19 @@ +package com.xcs.spring.bean; + +import org.springframework.beans.factory.DisposableBean; + +/** + * @author 林雷 + * @date 2023年10月09日 16时46分 + **/ +public class BeanC implements DisposableBean { + + public BeanC() { + System.out.println("BeanC Initialized"); + } + + @Override + public void destroy() throws Exception { + System.out.println("BeanC Destroyed"); + } +} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanFirst.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanFirst.java deleted file mode 100644 index 05e23b9..0000000 --- a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanFirst.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xcs.spring.bean; - -import org.springframework.context.annotation.DependsOn; -import org.springframework.stereotype.Component; - -/** - * @author 林雷 - * @date 2023年10月09日 16时45分 - **/ -@DependsOn("classBeanSecond") -@Component -public class ClassBeanFirst { - public ClassBeanFirst() { - System.out.println("ClassBeanFirst Initialized"); - } -} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanSecond.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanSecond.java deleted file mode 100644 index 486fe66..0000000 --- a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/ClassBeanSecond.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xcs.spring.bean; - -import org.springframework.stereotype.Component; - -/** - * @author 林雷 - * @date 2023年10月09日 16时46分 - **/ -@Component -public class ClassBeanSecond { - public ClassBeanSecond() { - System.out.println("ClassBeanSecond Initialized"); - } -} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanFirst.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanFirst.java deleted file mode 100644 index 4fac98e..0000000 --- a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanFirst.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.xcs.spring.bean; - -/** - * @author 林雷 - * @date 2023年10月09日 16时45分 - **/ -public class MethodBeanFirst { - public MethodBeanFirst() { - System.out.println("MethodBeanFirst Initialized"); - } -} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanSecond.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanSecond.java deleted file mode 100644 index 3d11ec4..0000000 --- a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/bean/MethodBeanSecond.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.xcs.spring.bean; - -/** - * @author 林雷 - * @date 2023年10月09日 16时46分 - **/ -public class MethodBeanSecond { - public MethodBeanSecond() { - System.out.println("MethodBeanSecond Initialized"); - } -} diff --git a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/config/MyConfiguration.java b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/config/MyConfiguration.java index 0454c8c..5e6eec0 100644 --- a/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/config/MyConfiguration.java +++ b/spring-annotation/spring-annotation-dependsOn/src/main/java/com/xcs/spring/config/MyConfiguration.java @@ -1,7 +1,8 @@ package com.xcs.spring.config; -import com.xcs.spring.bean.MethodBeanFirst; -import com.xcs.spring.bean.MethodBeanSecond; +import com.xcs.spring.bean.BeanA; +import com.xcs.spring.bean.BeanB; +import com.xcs.spring.bean.BeanC; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -16,13 +17,17 @@ import org.springframework.context.annotation.DependsOn; public class MyConfiguration { @Bean - @DependsOn("methodBeanSecond") - public MethodBeanFirst methodBeanFirst() { - return new MethodBeanFirst(); + public BeanA beanA() { + return new BeanA(); } @Bean - public MethodBeanSecond methodBeanSecond() { - return new MethodBeanSecond(); + public BeanB beanB() { + return new BeanB(); + } + + @Bean + public BeanC beanC() { + return new BeanC(); } } \ No newline at end of file