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首先被初始化。