spring-annotation-dependsOn调整最佳实践
parent
7d4b15c59e
commit
81ab090bbe
|
@ -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 注解的元数据会被忽略,
|
||||
* 而 <bean depends-on="..."/> 会被考虑。
|
||||
*
|
||||
* @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、源码分析总结
|
|
@ -11,5 +11,6 @@ public class DependsOnApplication {
|
|||
|
||||
public static void main(String[] args) {
|
||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
|
||||
context.close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue