public ServiceA serviceA() {
return new ServiceA();
}
}
@DependsOn:指定当前bean依赖的bean
用法
前面有篇文章中介绍了bean xml中depend-on的使用,建议先看一下:Spring系列第9篇:depend-on到底是干什么的?
@DependsOn等效于bean xml中的bean元素中的depend-on属性。
spring在创建bean的时候,如果bean之间没有依赖关系,那么spring容器很难保证bean实例创建的顺序,如果想确保容器在创建某些bean之前,需要先创建好一些其他的bean,可以通过@DependsOn来实现,@DependsOn可以指定当前bean依赖的bean,通过这个可以确保@DependsOn指定的bean在当前bean创建之前先创建好
看一下其源码:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
String[] value() default {};
}
可以用在任意类型和方法上。
value:string类型的数组,用来指定当前bean需要依赖的bean名称,可以确保当前容器在创建被@DependsOn标注的bean之前,先将value指定的多个bean先创建好。
常见2种用法
-
和@Compontent一起使用在类上
-
和@Bean一起标注在方法上
案例1:和@Compontent一起使用在类上
下面定义3个bean:service1、service2、service3;service1需要依赖于其他2个service,需要确保容器在创建service1之前需要先将其他2个bean先创建好。
看代码:
Service2
package com.javacode2018.lesson001.demo27.test3;
import org.springframework.stereotype.Component;
@Component
public class Service2 {
public Service2() {
System.out.println(“create Service2”);
}
}
Service3
package com.javacode2018.lesson001.demo27.test3;
import org.springframework.stereotype.Component;
@Component
public class Service3 {
public Service3() {
System.out.println(“create Service3”);
}
}
Service1
package com.javacode2018.lesson001.demo27.test3;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
@DependsOn({“service2”, “service3”}) //@1
@Component
public class Service1 {
public Service1() {
System.out.println(“create Service1”);
}
}
@1:使用了@DependsOn,指定了2个bean:service2和service3,那么spring容器在创建上面这个service1的时候会先将@DependsOn中指定的2个bean先创建好
来个配置类
package com.javacode2018.lesson001.demo27.test3;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class MainConfig3 {
}
测试用例
@Test
public void test3() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig3.class);
System.out.println(context.getBean(Service1.class));
}
运行输出
create Service2
create Service3
create Service1
com.javacode2018.lesson001.demo27.test3.Service1@9f116cc
从