Spring Bean

Posted Kirl z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Bean相关的知识,希望对你有一定的参考价值。

Spring Bean

1. Spring Bean

Spring 框架是提供容器统一管理 Bean 对象(Java对象), 及对象间依赖关系

Spring IoC 容器管理的对象成为 Bean,Bean 根据 Spring 配置文件中的信息创建

Spring 配置文件支持两种格式,即 XML 和 Properties 文件格式

  1. Properties 配置文件主要以 key - value 健值对的形式存在,只能赋值,不能进行其他操作,适合于简单的属性配置。
  2. XML 配置文件是树形结构,相对于 Properties 文件来说更为灵活。XML 配置文件结构清晰,但是内容比较繁琐,适用于大型复杂的项目。

2. Spring Bean 的作用域

Spring 容器在初始化一个 Bean 实例时,同时会指定该实例的作用域。

  1. singleton: 单例模式,在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例。
  2. prototype: 每次通过容器的getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例。
  3. request: 对于一次HTTP请求,request作用域的Bean将只生成一个实例,这意味着,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。
  4. session:该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。

如果不指定Bean的作用域,Spring默认使用singleton作用域。prototype作用域的Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成果,就可以重复使用。因此,应该尽量避免将Bean设置成prototype作用域。

3. Spring Bean 生命周期

传统 Java 应用中, Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动回收。

Spring 中 Bean 的生命周期比较复杂,可以表示为:

  • Bean 的定义 -> Bean 的初始化 -> Bean 的使用 -> Bean 的销毁。

Spring 根据 Bean 的作用域来选择管理方式。对于 singleton 作用域的 Bean,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁;而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。

Spring Bean 生命周期

  1. 实例化Bean:通过反射调用构造方法实例化对象。
  2. 依赖注入:装配Bean的属性
  3. 实现了Aware接口的Bean,执行接口方法:如顺序执行BeanNameAware、BeanFactoryAware、
    ApplicationContextAware的接口方法。
  4. Bean对象初始化前,循环调用实现了BeanPostProcessor接口的预初始化方法
    (postProcessBeforeInitialization)
  5. Bean对象初始化:顺序执行@PostConstruct注解方法、InitializingBean接口方法、init-method
    方法
  6. Bean对象初始化后,循环调用实现了BeanPostProcessor接口的后初始化方法
    (postProcessAfterInitialization)
  7. 容器关闭时,执行Bean对象的销毁方法,顺序是:@PreDestroy注解方法、DisposableBean接口
    方法、destroy-method

以上是关于Spring Bean的主要内容,如果未能解决你的问题,请参考以下文章

[转]spring 学习-bean创建-循环依赖-2

Spring中@Bean和FactoryBean作用和区别

外置 tomcat启动Spring Boot程序模式下解决过滤器注入bean的空指针问题

spring的BeanFactory和ApplicationContext

Spring——使用自定义标签

Spring IOC容器的初始化-BeanDefinition的注册