spring bean加载顺序
1、使用Spring @DependsOn控制bean加载顺序
该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。
1.1 用法
- 直接或者间接标注在带有@Component注解的类上面。
- 直接或者间接标注在带有@Bean 注解的方法上面。
使用@DependsOn注解到类层面仅仅在使用component scanning方式时才有效;如果带有@DependsOn注解的类通过XML方式使用,该注解会被忽略,
2、java示例
2.1 定义实体类
import javax.annotation.PostConstruct;
/**
* @Title: BeanA.java
* @Package com.spring.pro.bean
* @Description:
* @author ybwei
* @date 2018年11月21日 下午2:56:40
* @version V1.0
*/
public class BeanA {
public BeanA(){
System.out.println("A构造方法");
}
@PostConstruct
public void postC(){
System.out.println("A:@PostConstruct");
}
public void init() {
System.out.println("Bean A");
}
}
/**
* @Title: BeanA.java
* @Package com.spring.pro.bean
* @Description:
* @author ybwei
* @date 2018年11月21日 下午2:56:40
* @version V1.0
*/
public class BeanB {
public void init() {
System.out.println("Bean B");
}
}
2.2 实例化实体类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import com.spring.pro.bean.BeanA;
import com.spring.pro.bean.BeanB;
/**
* @ClassName: RabbitConfig
* @Description:
* @author weiyb
* @date 2017年12月17日 下午6:08:21
*
*/
@Configuration
public class BeanConfig {
/**
* initMethod执行初始化方法
* @DependsOn,必须beanB先被初始化,beanA才会初始化
* @return
* @author ybwei
*/
@Bean(name = "beanA", initMethod = "init")
@DependsOn("beanB")
public BeanA myBeanA() {
return new BeanA();
}
@Bean(name = "beanB", initMethod = "init")
public BeanB myBeanB() {
return new BeanB();
}
}
2.3 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName: ProviderApplication
* @Description:
* @author weiyb
* @date 2017年5月24日 下午2:29:27
*/
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
2.4 分析
启动后打印日志
Bean B
A构造方法
A:@PostConstruct
Bean A
因为BeanA需要BeanB先实例化后,才会实例化。
加载顺序:Constructor (构造方法)> @PostConstruct > init-method(bean中的init)
还没有评论,来说两句吧...