Spring @DependsOn注释

时间:2020-01-09 10:44:34  来源:igfitidea点击:

有时,bean之间的依赖关系可能不是直接的,但是我们可能仍要确保在另一个bean之前初始化特定的bean。例如,在一个bean中,有一个静态块必须在初始化另一个bean之前执行。我们可以使用Spring @DependsOn注释来显式强制初始化一个或者多个bean。

我们将使用@DependsOn注释对其中一个bean进行注释,并确保使用@DependsOn指定的bean由该bean之前的容器创建。

例如,在以下定义中,可以确保在创建beanC之前由Spring IOC容器创建beanA和beanB。

@Bean
@DependsOn({"beanA","beanB"})
public ClassC beanC() {
	..
	..
}

Spring @DependsOn注释示例

这是定义三个类ClassA,ClassB和ClassC的完整示例。我们要确保在初始化ClassC之前先初始化ClassA和ClassB。

public class ClassA {
  public ClassA(){
    System.out.println("In constructor of ClassA");
  }
  //static block
  static {
    System.out.println("in static block ClassA");
    System.out.println("Register DB Driver as a one time activity");
  }
}
public class ClassB {
  public ClassB(){
    System.out.println("In constructor of ClassB");
  }
}
public class ClassC {
  public ClassC(){
    System.out.println("In constructor of ClassC");
  }
}

Java配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import com.theitroad.springbeans.ClassA;
import com.theitroad.springbeans.ClassB;
import com.theitroad.springbeans.ClassC;
 
@Configuration
public class AppConfig {
  @Bean
  @DependsOn({"beanA","beanB"})
  public ClassC beanC() {
    return new ClassC();
  }
  @Bean
  public ClassB beanB() {
    return new ClassB();
  }
  @Bean
  public ClassA beanA() {
    return new ClassA();
  }
}

如我们在这里看到的,@DependsOn与以Bean(beanC())注释的方法一起使用,并指定其他两个bean @DependsOn({" beanA"," beanB"})。这样可以强制在beanC之前初始化beanA和beanB。

为了运行该应用程序,我们可以使用以下类。

public class App {
  public static void main(String[] args) {
    AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    ClassC obj = context.getBean("beanC", ClassC.class);
    context.close();
  }
}

输出:

10:52:01.160 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanA'
in static block ClassA
Register DB Driver as a one time activity
In constructor of ClassA
10:52:01.293 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanB'
In constructor of ClassB
10:52:01.297 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanC'
In constructor of ClassC

从输出中可以看到,beanA和beanB首先被初始化。