一、Bean的解析加載
IOC容器啟動
IOC容器通過applicationContext.refresh()加載注冊Bean到IOC容器,默認(rèn)的IOC容器為DefaultListableBeanFactory:
常用的加載方式如下。
ClassPathXmlApplicationContext:從ClassPath路徑中加載 XML 配置的上下文。
FileSystemXmlApplicationContext:從文件系統(tǒng)中加載XML 配置的上下文。
XmlWebApplicationContext: Web開發(fā)中從 XML 中記載 Web 上下文,區(qū)別 于上面 兩個之處在于, 此上下文是基于 ServletContext的。
AnnotationConfigWebApplicationContext:從注解類中加載 Web 上下文。
ClassPathXmlApplicationContext 加載流程:
Bean解析完成之后就會注冊到IOC容器
二、Bean的生命周期管理
在Spring容器管理了Bean的生命周期,在Bean的生命周期內(nèi),我們可以通過配置或?qū)崿F(xiàn)接口完成Bean在生命周期內(nèi)的職責(zé)比如:@Autowired自動注入,Druid數(shù)據(jù)庫連接池的初始化,連接池的關(guān)閉等。
下面主要介紹Spring為Bean初始化、銷毀提供的擴展方法
Bean的初始化:
1.實現(xiàn)BeanNameAware接口的 Bean 能夠感知到 自己在BeanFactory 中注冊的名稱。
2.實現(xiàn)BeanFactoryAware的 Bean 能夠感知到 自己所屬的 BeanFactory
3.直接在 Bean 的構(gòu)造方法里做初始化工作 。
4.使用@PostConstruct 注解,指明在 Bean 構(gòu)造器方法執(zhí)行后執(zhí)行的方法。
5.Bean 實現(xiàn) InitializingBean接口,在 afterPropertiesSet 中做初始化工作。
6.在 XML中使用init-method指定Bean 構(gòu)造完成后調(diào)用的方法。
7.實現(xiàn)BeanPostProcessor接口,可以執(zhí)行Bean初始化的處理邏輯。可用于自定義注解實現(xiàn)
例如:
Spring內(nèi)置的BeanPostProcessor實現(xiàn):
CommonAnnotationBeanPostProcessor解析@Resource注解
RequiredAnnotationBeanPostProcessor解析@Required注解
AutowiredAnnotationBeanPostProcessor解析@Autowired注解
ApplicationContextAwareProcessor用于為注入ApplicationContext等容器對象
Bean的銷毀
1.使用@PreDestroy注解,指明容器關(guān)閉后執(zhí)行的方法
2.實現(xiàn)Disposable接口,在destory方法做銷毀工作
3.在Xml配置中指定destory-method方法