spring学习笔记之bean的生命周期

IOC容器初始化总结:

  1. 通过setConfigLocations载入spring配置文件;

  2. 初始化容器入口通过refresh方法,进入AbstractApplicationContext实现的refresh方法。

  3. 然后通过obtainFreshBeanFactory方法进入子类AbstractRefreshableApplicationContext实现的refreshBeanFactory刷新一个容器工厂

  4. 在此创建了DefaultListableBeanFactory类,并调用loadBeanDefinitions(beanFactory)装载bean定义

  5. 接着以AbstractRefreshableApplicationContext为中心回到此类,进入其子类AbstractXmlApplicationContext实现的loadBeanDefinitions方法。对applicationContext.xml的解析操作,就是解析工厂的那个xml。

  6. 再接着通过AbstractXmlApplicationContext的loadBeanDefinitions进入到AbstractBeanDefinitionReader类的loadBeanDefinitions。通过获取资源方法resourceLoader.getResource(location),获取到要加载的资源。再真正执行加载功能是其子类XmlBeanDefinitionReader实现的loadBeanDefinitions方法。

  7. 接着进入XmlBeanDefinitionReader中的loadBeanDefinitions。(XmlBeanDefinitionReader通过调用其父类中调用的DefaultResourceLoader的getResource方法获取要加载的资源)DocumentLoader将Bean定义资源转换成Document对象。

  8. doLoadBeanDefinitions中进入DefaultBeanDefinitionDocumentReader类的registerBeanDefinitions 解 析 D ocument对象

  9. 解析完后,调用DefaultListableBeanFactory类中使用一个HashMap的集合对象存放IoC容器中注册解析的BeanDefinition

 

bean的生命周期

  1. Bean实例的创建:默认是单例
  2. 为Bean实例设置属性,执行Bean的属性的依赖注入
  • 依赖注入:构造方法注入,set方法注入,注解注入(@Autowired)
  1. 调用Bean实例的初始化方法:initializeBean方法
    1. 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
    2. 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以)
    3. 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
    4. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
    5. 如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
    6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法Spring AOP 会在 IOC 容器创建 bean 实例的最后对 bean 进行处理。其实就是在这一步进行代理增强
  2. 应用可以通过IoC容器使用Bean
  3. 容器关闭时,调用Bean的销毁方法
  • 在调用初始化方法之前,会调用一系列的aware接口实现,把相关的BeanName,BeanClassLoader以及BeanFactory注入到bean中,然后调用invokeInitMethods之后判断Bean是否有initMethod,如果有,通过invokeCustomInitMethod方法来直接调用,然后完成Bean的初始化。

 

è¿éåå¾çæè¿°

 

spring 生命周期最详解

https://blog.csdn.net/qq_23473123/article/details/76610052

你可能感兴趣的:(spring,ssm)