spring bean加载顺序

1、使用Spring @DependsOn控制bean加载顺序

该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。

1.1 用法

  • 直接或者间接标注在带有@Component注解的类上面。
  • 直接或者间接标注在带有@Bean 注解的方法上面。

使用@DependsOn注解到类层面仅仅在使用component scanning方式时才有效;如果带有@DependsOn注解的类通过XML方式使用,该注解会被忽略,<bean depends-on="..."/>这种方式会生效;

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)

猜你喜欢

转载自blog.csdn.net/xixingzhe2/article/details/84329622