美文网首页
Spring Bean的生命周期和作用域

Spring Bean的生命周期和作用域

作者: hTangle | 来源:发表于2019-04-07 19:40 被阅读0次
    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的初始化。

    作用域

    1. singleton:默认值
    2. prototype:每次从容器中调用Bean时,都返回一个新的实例,调用getBean时相当于new Bean
    3. request:每次HTTP请求都会创建一个新的Bean,该作用域仅仅适用于WebApplicationContext环境
    4. session:同一个Http Session共享一个Bean,不同的Session使用不同的Bean,适用于WebApplicationContext环境
    5. globalSession:

    Spring注解

    • @controller控制器(注入服务)

    • @RestController:相当于@ResponseBody+@Controller结合,返回JSON需要在对应的方法上加@ResponseBody

    • @service 服务(注入dao)

    • @repository dao(实现dao访问)

    • @component (把普通的pojo实例化到spring容器中,相当于配置文件中<bean id="" class="">)

    • @EnableAutoConfiguration:借助AutoConfigurationImportSelector.class(SpringFactoriesLoader.loadFactoryNames())可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器中。

    • SpringFactoriesLoader:
      从META-INF/spring-factories加载配置,有三个静态方法:loadFactories:加载指定的factoryClass并进行实例化。loadFactoryNames:加载指定的factoryClass的名称集合。instantiateFactory:对指定的factoryClass进行实例化。

    • @Autowired和@Resource的区别
      1)都可以用来装配bean,都可以写在setter方法上
      2)@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,设置require属性为false:@Autowired(required=false),想要按照名称装配,接口@Qualifier使用
      3)@Resource注解输入J2EE,默认按照名称装配,名称可以通过name属性指定,找不到名称才按照类型装配

    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

    参考地址1
    [参考地址2](https://javadoop.com/post/spring-ioc

    )

    相关文章

      网友评论

          本文标题:Spring Bean的生命周期和作用域

          本文链接:https://www.haomeiwen.com/subject/juysiqtx.html