首页 > 其他分享 >Spring中@DependsOn 使用详解

Spring中@DependsOn 使用详解

时间:2023-05-30 21:47:24浏览次数:42  
标签:Spring DependsOn 详解 DependsOnClassA DependsOnClassB 注解 public

一、注解源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
    String[] value() default {};
}

二、基础概念

    @DependsOn是Spring框架用来指定bean之间依赖关系的注解之一,即可用户类上,也可用户方法上。当我们在配置Spring的bean时,有些情况下一个bean可能会依赖于另外

一个bean的初始化(但是并不需要持有,如果需要持有直接注入即可,同时也会保证顺序),此时就可以使用@DependsOn来指定依赖关系,确保它们的初始化顺序得到保证。

作用在类上:

@Component(value = "dependsOnClassA")
@DependsOn(value = {"dependsOnClassB"})
public class DependsOnClassA {
    private final Logger logger = LoggerFactory.getLogger(DependsOnClassA.class);
    public DependsOnClassA(){
        logger.info("执行DependsOnClassA的构造方法");
    }
}

可以看到,DependsOnClassA类上使用@Component注解标注,并且指定了Bean的名称为dependsOnClassA(若不指定默认驼峰),以及使用@DependsOn注解指定了依赖的Bean名称为dependsOnClassB。

@Component(value = "dependsOnClassB")
public class DependsOnClassB {
    private final Logger logger = LoggerFactory.getLogger(DependsOnClassB.class);
    public DependsOnClassB(){
        logger.info("执行DependsOnClassB的构造方法");
    }
}

可以看到,在DependsOnClassB类上标注了@Component注解,指定了Bean对象的名称为dependsOnClassB。由DependsOnClassA类和DependsOnClassB类可以看出,在Spring中创建DependsOnClassA类的对象时,会依赖DependsOnClassB类的对象。所以,在Spring中,创建DependsOnClassA类的对象之前,会先创建DependsOnClassB类的对象。

    需要注意的是,使用@DependsOn注解应该尽量避免出现循环依赖(即 A 依赖于 B,而 B 又依赖于 A),否则会导致应用程序启动失败。同时,这种方式也会使代码显得不够优雅,因此在实际开发中建议使用更好的依赖注入方式,尽量避免使用@DependsOn注解。

 

更多详细和源码见:https://developer.aliyun.com/article/1177892

 

标签:Spring,DependsOn,详解,DependsOnClassA,DependsOnClassB,注解,public
From: https://www.cnblogs.com/damoblog/p/17444536.html

相关文章

  • 第四篇 - Spring Boot写一个登录功能1
    SpringBoot+Mysql+jdk8一、新建SpringBoot项目 创建成功后的目录为 创建多个package,结构如下: 先尝试build一下项目 报错java:警告:源发行版17需要目标发行版17 Rebuild一下项目 报错类文件具有错误的版本61.0,应为52.0 重启IDEA,Rebuild项......
  • Sentinel整合Spring Cloud Gateway、Zuul详解
    Sentinel支持对SpringCloudGateway、Zuul等主流的APIGateway进行限流。编辑切换为居中添加图片注释,不超过140字(可选)Sentinel1.6.0引入了SentinelAPIGatewayAdapterCommon模块,此模块中包含网关限流的规则和自定义API的实体和管理逻辑:GatewayFlowRule:网关限流规......
  • springboot启动源码
    每个SpringBoot项目都有一个主程序启动类,在主程序启动类中有一个启动项目的main()方法,在该方法中通过执行SpringApplication.run()即可启动整个SpringBoot程序。问题:那么SpringApplication.run()方法到底是如何做到启动SpringBoot项目的呢?下面我们查看run()方法内部的源码,核......
  • 转:多线程详解
    转自:https://juejin.cn/post/71230166680951849331.什么是多线程1.1进程当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。1.2线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈......
  • 分页 springboot
    maven<!--https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spri......
  • Spring之状态机讲解
    目录1状态机1.1什么是状态1.2四大概念1.3状态机1.4springstatemachine2示例Demo2.1订单状态图2.2建表2.3依赖和配置2.3.1pom.xml2.3.2application.yml2.4状态机配置2.4.1定义状态机状态和事件2.4.2定义状态机规则2.4.3配置持久化2.4.3.1持久化到内存2.4.3.2持久......
  • java spring添加自义定拦截器后发生访问路径错误,状态码应该返回404时却返回200的bug
    javaspring添加自义定拦截器后发生访问路径错误,状态码应该返回404时却返回200的bug问题自义定拦截器LoginInterceptor继承HandlerInterceptor,自义定配置类继承WebMvcConfigurer。配置类中@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){......
  • hj_podman_jenkins_maven_git_springboot_ssh一键部署项目
    podmanpulljenkins/jenkins:jdk17podmanrun-d--privileged=true\-uroot--namejenkins_jdk17_8081\-p8081:8080-p50001:50000\-v/hj_files/jenkins_jdk17:/var/jenkins_home\a307650508c6http://105.35.260.230:8081/ 安装好推荐配置后.再安装俩插件  Mave......
  • springboot-解决项目编译后resources下文件生成乱码问题
    SpringBoot项目下resources文件项目编译之后resources下文件会生成乱码,是说明maven打包的时候出现问题缺少一个插件<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId>......
  • 详解RocketMQ 顺序消费机制
    摘要:顺序消息是指对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息先消费,后发布的消息后消费。本文分享自华为云社区《RocketMQ顺序消费机制》,作者:勇哥java实战分享。顺序消息是指对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则......