35

Bean对象的定义?

在Spring框架中由Spring创建和管理的对象的对象称之为Bean对象。

Bean对象的特性?

Spring框架为了更加科学的管理和应用Bean对象,为其设计相关特性,例如:懒加载、作用域以及生命周期方法。

懒加载(Lazy)

在Spring框架中,默认会在启动时会创建所有的Bean对象,但有些bean对象假如长时间不用,启动时就创建对象,会占用其内存资源,从而造成一定的资源浪费,此时我们可以基于懒加载策略延迟对象的创建,在设计类时,在类上添加@Lazy注解,例如:

package com.cy.pj.common.pool;
@Component
@Lazy
public class ObjectPool {
  public ObjectPool() {
    System.out.println("ObjectPool()");
  }
}
其中,@Lazy注解中有一个value属性,其默认值为true表示延迟加载。

作用域(Scope)

Spring框架创建对象以后,可以给对象一个作用域,目的是让对象在一定范围内可以进行重用,常用有单例(singleton)和多例(prototype)两种,其中:

  • singleton:此作用域指的是,名字和类型相同的Bean对象实例在整个Spring容器中只能一份。此实例何时创建与类的延迟加载特性配置有关,此实例创建以后,生命周期会由spring框架管理。
  • prototype:此作用域指的是,每次从Spring容器获取对象都会创建新实例,此实例会在需要时创建与lazy特性无关,这个实例创建以后,spring可以对其初始化,但不负责销毁。

基于注解@Scope方式设定Bean作用域,代码演示:

package com.cy.pj.common.pool;、
@Lazy
@Scope("singlton")
@Component
public class ObjectPool {
  public ObjectPool() {
    System.out.println("ObjectPool()");
  }
}
Spring中默认bean对象的作用域为singleton,假如希望是prototype可以使用@Scope("prototype")

生命周期方法

程序中每个对象都有生命周期,但不是每个对象类型定义时,都要定义生命周期方法,当一个Bean对象创建以后假如还需执行额外初始化,销毁之前也需要额外的其它资源的释放,Spring框架可以为类定义其生命周期方法。假如是注解方式,我们可以采用如下两个注解进行实现。

  • @PostConstruct 注解用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行(是对象创建以后的初始化)。
  • @PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)。

代码演示:

package com.cy.pj.common.pool;、
@Lazy
@Scope("singlton")
@Component
public class ObjectPool {
  public ObjectPool() {
    System.out.println("ObjectPool()");
  }
  @PostConstruct 
  public void init() {
    System.out.println("init()");
  }
  @PreDestroy
  public void close() {
    System.out.println("close()");
  }
}
一般池对象都会设置一些生命周期方法,例如连接池。

总结(Summary)

本小节主要对Spring框架中的Bean对象特性做了一个概要分析,可以通过这个分析了解Spring框架是如何科学应用bean对象的。


Jason
4.2k 声望17.2k 粉丝

以终为始,闭环迭代,持续提高。