# SpringBoot **Repository Path**: naclnezn/spring-boot ## Basic Information - **Project Name**: SpringBoot - **Description**: SpringBoot - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-10 - **Last Updated**: 2024-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpringBoot # 一、 @DependsOn注解 ## 1.1 描述 ```@DependsOn```注解,用于定义 Bean 初始化顺序。 有时,我们可能会碰到某些 Bean 需要在其他 Bean 之前被初始化的情况。在这种情况下, 我们可以使用 @DependsOn 注解来明确指定 Bean 的初始化顺序。 ```@DependsOn```注解是 Spring 框架自 ```3.0``` 版本开始引入的一个核心注解 其中value属性是 @DependsOn 注解的主要属性,它允许我们定义当前bean依赖的其他bean的名称。 [DependsOnTest.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringboot%2FDependsOn%2FDependsOnTest.java) ## 1.2 注意事项 1. 避免循环依赖 - 确保不创建一个循环依赖的场景,即 Bean A 依赖 Bean B,同时 Bean B 又依赖 Bean A。 这会导致 Spring 容器无法成功初始化这两个 beans。 2. 不要过度使用 - 只在真正需要控制初始化顺序时使用这个注解。过度使用可能使代码更难理解和维护。 3. 与构造器/属性注入结合使用 - 即使我们使用了 @DependsOn,如果一个 bean 需要另一个 bean 作为构造函数参数或属性,我们还是应该使用 @Autowired 或 XML 配置进行注入。 4. 销毁顺序 - @DependsOn 也会影响 beans 的销毁顺序。如果 Bean A 依赖于 Bean B,那么在销毁时,Bean A 会在 Bean B 之后被销毁。 5. 不是为运行时依赖 - 请注意,@DependsOn 只确保初始化顺序。如果我们的 bean 在运行时需要另一个 bean,那么我们应该考虑其他方法,如注入。 6. 与 @Lazy 结合使用 - 如果我们的 bean 使用了 @Lazy 注解(表示它会延迟初始化),同时又用 @DependsOn 指定了依赖,那么这可能会导致意外的初始化顺序,因为延迟初始化的 bean 可能不会按预期的顺序被初始化。 7. 组件扫描与显式声明 - 如果我们使用组件扫描(通过 @ComponentScan)并且在类级别使用了 @DependsOn,那么这个注解会生效。但如果通过 XML 定义了该 bean,并且还在类上使用了 @DependsOn,那么注解会被忽略,我们应该使用 XML 的 depends-on 属性来声明依赖。 8. 不适用于 @Bean 方法的参数 - 如果我们在 Java 配置类中使用 @Bean 方法定义 beans,并尝试通过方法参数注入依赖,那么 @DependsOn 不会对这些依赖产生影响,因为方法参数自然地声明了初始化顺序。