Spring Bean的創建過程
以下代碼是學習Spring的hello world,第一行代碼中的ApplicationContext會管理項目中的bean,本文從Bean的創建過程展開...
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = applicationContext.getBean(UserService.class);
bean的生成過程如下:
推斷構造方法 -> 普通對象 -> 依賴注入(DI)-> 初始化前(@PostConstruct)-> 初始化(implements InitializingBean) -> 初始化后(AOP)-> Bean
推斷構造方法
先掃描指定目錄下帶@Component的class, 然后通過推斷構造方法來先生成一個實例
-
如果該類只有一個構造方法就用該構造方法來生成對象
example(只有一個無參構造)
@Component public class UserService { public static final Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired private OrderService orderService; public UserService() { logger.info("UserService construct -- without param "); } public String getUerNameById(int userId) { return "simon"; } }
測試類
public class ApplicationTests { public static final Logger logger = LoggerFactory.getLogger(ApplicationTests.class); public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = applicationContext.getBean(UserService.class); String uerName = userService.getUerNameById(1); logger.info(uerName); } }
從運行結果可知使用無參構造來初始化bean
example(只有一個有參構造)
@Component public class UserService { public static final Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired private OrderService orderService; public UserService() { logger.info("UserService construct -- without param "); } public String getUerNameById(int userId) { return "simon"; } }
從運行結果可知使用有參構造來初始化bean
-
如果該類有多個構造方法,使用無參構造方法,沒有無參就報錯
example(一個無參構造,一個有參)
public UserService() { logger.info("UserService construct -- without param "); } public UserService(OrderService orderService) { logger.info("UserService construct -- with orderService"); }
從運行結果可知使用仍無參構造來初始化的bean
example(兩個有參,沒有無參)
public UserService() { logger.info("UserService construct -- without param "); } public UserService(OrderService orderService) { logger.info("UserService construct -- with orderService"); }
找不到默認的構造方法,exception:No default constructor found
依賴注入
通過構推斷法得到一個實例后,Spring會判斷該對象中的屬性是否含有@Autowired, 如果有的話就把這些屬性從context中找出來,然后注入到該對象中