• Spring框架系列(三)--Bean的作用域和生命周期


    Bean的作用域

    Spring应用中,对象实例都是在Container中,负责创建、装配、配置和管理生命周期(new到finalize())

    Spring Container分为两种:

      1、BeanFactory:提供DI支持

      2、ApplicationContext:基于BeanFactory构建,提供应用框架级别的服务

    ApplicationContext实现类

      1、AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文

      2、AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文

      3、ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源

      4、FileSystemXmlapplicationcontext从文件系统下的一个或多XML配置文件中加载上下文定义

      5、XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义

    加载上下文的方式都很相似:都是直接new。例如:ApplicationContext applicationContext = new ClassPathXmlApplicationContext

    ("applicationContext.xml"); 之后就是调用应用上下文的getBean()获取bean

    Spring作用域:

      1、单例Singleton:在整个应用中,只创建bean的一个实例,在IOC容器中共享,容器创建的时候就实例化了这个bean

      2、原型Prototype:每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例,相当于每次都new bean(),容器创建的

    时候没有实例化了bean,而是请求获取的时候才会创建对象

      3、会话Session:只是在Web应用中,为每个http session创建一个bean实例

      4、请求Rquest:只是在Web应用中,为每个http请求创建一个bean实例,这个bean实例只在当前request请求内有效,请求结束的时候,这个

    bean实例被销毁

      5、全局会话GlobalSession:只是在Web应用中使用,仅在使用portlet context的时候有效

    1、Singleton:

    默认为Singleton,对于无状态的bean可以使用单例,如果使用非单例,通过@Scope设置

    无状态Bean:

      无状态是指没有成员变量,例如service、dao,虽然service里面有dao,但是dao是没有状态的

      有状态是指有成员变量,例如controller内部一般有类似UserDTO的有状态bean,所以一般使用prototype

    容器实例化的时候就会初始化bean,可以通过lazy-init="true"/@Lazy设置延迟加载,当第一次获取bean的时候进行初始化

    @Lazy(true)
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class Student {    }

    2、Prototype:

    scope使用Prototype,默认懒加载,即等到获取bean的时候进行初始化,而不是容器实例化的时候

    当容器关闭的时候,destroy()不会被执行

    Bean的生命周期

    流程:

      1、Spring对bean进行实例化

      2、Spring将值和bean的引用注入到bean对应的属性中

      3、如果bean实现了BeanNameAware接口, Spring将bean的ID传递给setBeanName()

      4、如果bean实现了BeanFactoryAware接口, Spring将调用setBeanFactory(),将BeanFactory容器实例传入

      5、如果bean实现了ApplicationContextAware接口, Spring将调用setApplicationContext(),将bean所在的应用上下文的引用传入

    进来

      6、如果bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessBeforeInitialization()

      7、如果bean实现了InitializingBean接口, Spring将调用它们的afterPropertiesSet()。类似地,如果bean使用init-method声

    明了初始化方法,该方法也会被调用

      8、如果bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessAfterInitialization()

      9、此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁

      10、如果bean实现了DisposableBean接口, Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了

    毁方法,该方法也会被调用

  • 相关阅读:
    由1433端口入侵,浅谈sqlserver安全 (转)
    使用 Aircrack-ng 破解 WEP 和 WPA/WPA2 加密的 Wi-Fi 密码。(转)
    ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义 .的分析解决办法 (转)
    提高D3js力导向图加载速度(转)
    Asp.Net实现FORM认证的一些使用技巧(转)
    Windows Server 2008 R2 备份和恢复 (转)
    搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇
    Beego源码分析(转)
    go语言实现一个简单的登录注册web小程序
    从无线安全到内网渗透(转)
  • 原文地址:https://www.cnblogs.com/huigelaile/p/10975128.html
Copyright © 2020-2023  润新知