spring bean載入順序
阿新 • • 發佈:2018-12-21
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)