1. 程式人生 > >spring bean載入順序

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)