SpringFramework Core(四)

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-scopes

Bean范围

创建bean定义时,将创建一个配方,用于创建该bean定义所定义的类的实际实例。您可以从一个配方中创建许多对象实例。
您不仅可以控制要插入到从特定bean定义创建的对象中的各种依赖项和配置值,还可以控制从特定bean定义创建的对象的范围。可以将Bean定义为部署在多个范围之一。

Spring Framework支持六个范围,其中只有在使用web感知时才可用ApplicationContext。

Singleton:(默认)将每个Spring IoC容器的单个bean定义范围限定为单个对象实例。
Prototype:将单个bean定义的作用域限定为任意数量的对象实例。
Request:将单个bean定义的范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有一个在单个bean定义后面创建的bean实例。仅在可感知网络的Spring ApplicationContext上下文中有效。
Session:将单个bean定义的范围限定为HTTP的生命周期Session。仅在可感知网络的Spring ApplicationContext上下文中有效。
Application:将单个bean定义的作用域限定为的生命周期ServletContext。仅在可感知网络的Spring ApplicationContext上下文中有效。
Websocket:将单个bean定义的作用域限定为的生命周期WebSocket。仅在可感知网络的Spring ApplicationContext上下文中有效。

从Spring 3.0开始,线程作用域可用,但默认情况下未注册。

Singleton Scope

仅管理一个singleton bean的一个共享实例,并且所有对具有ID或与该bean定义相匹配的ID的bean的请求都将导致该特定的bean实例由Spring容器返回。
换句话说,当您定义一个bean定义并且其作用域为单例时,Spring IoC容器将为该bean定义所定义的对象创建一个实例。该单个实例存储在此类单例bean的缓存中,并且对该命名bean的所有后续请求和引用都返回缓存的对象。

image.png

Prototype Scope

每次对特定bean提出请求时,bean部署的非单一原型范围都会导致创建一个新bean实例。也就是说,将Bean注入到另一个Bean中,或者您可以通过getBean()容器上的方法调用来请求它。通常,应将原型作用域用于所有有状态Bean,将单例作用域用于无状态Bean。


image.png

与其他作用域相比,Spring不能管理原型Bean的完整生命周期。容器实例化,配置或组装原型对象,然后将其交给客户端,而无需对该原型实例的进一步记录。因此,尽管在不考虑作用域的情况下在所有对象上都调用了初始化生命周期回调方法,但在原型的情况下,不会调用已配置的销毁生命周期回调。客户端代码必须清除原型作用域内的对象并释放原型Bean拥有的昂贵资源。

为了使Spring容器释放原型作用下的bean所拥有的资源,请尝试使用自定义bean后处理器,其中包含对需要清理的bean的引用。

在某些方面,Spring容器在原型作用域bean方面的角色是Java new运算符的替代。超过该时间点的所有生命周期管理必须由客户端处理。(有关Spring容器中bean生命周期的详细信息,请参阅Lifecycle Callbacks。)

定义Bean的性质

Spring框架提供了许多接口,可用于自定义Bean的性质。本节将它们分组如下:
生命周期回调
ApplicationContextAwareBeanNameAware
其他Aware介面

生命周期回调

为了与容器对bean生命周期的管理进行交互,可以实现Spring InitializingBean和DisposableBean接口。

通常,JSR-250 @PostConstruct和@PreDestroy注释被认为是在现代Spring应用程序中接收生命周期回调的最佳实践。使用这些注释意味着您的bean没有耦合到特定于Spring的接口。

在内部,Spring Framework使用BeanPostProcessor实现来处理它可以找到的任何回调接口并调用适当的方法。如果您需要自定义功能或其他生命周期行为,Spring默认不提供,则您可以BeanPostProcessor自己实现。有关更多信息,请参见 容器扩展点

除了初始化和销毁​​回调外,Spring托管的对象还可以实现Lifecycle接口,以便这些对象可以在容器自身生命周期的驱动下参与启动和关闭过程。

初始化回调

org.springframework.beans.factory.InitializingBean
容器在bean上设置了所有必需的属性后,该接口使bean可以执行初始化工作。

我们建议您不要使用该InitializingBean接口,因为它不必要地将代码耦合到Spring。另外,我们建议使用@PostConstruct注释或指定POJO初始化方法。对于基于XML的配置元数据,可以使用init-method属性指定具有无效无参数签名的方法的名称。通过Java配置,您可以使用的initMethod属性 @Bean

销毁回调

org.springframework.beans.factory.DisposableBean
当包含该接口的容器被销毁时,实现该接口可使Bean获得回调。

我们建议您不要使用DisposableBean回调接口,因为它不必要地将代码耦合到Spring。另外,我们建议使用@PreDestroy注释或指定bean定义支持的通用方法。使用基于XML的配置元数据时,您可以在destroy-method上使用属性<bean/>。通过Java配置,您可以使用的destroyMethod属性@Bean

ApplicationContextAware和BeanNameAware

当ApplicationContext创建创建实现该org.springframework.context.ApplicationContextAware接口的对象实例时,该实例将获得对该 接口的引用ApplicationContext。以下清单显示了ApplicationContextAware接口的定义:

public interface ApplicationContextAware {

    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

因此,bean可以ApplicationContext通过ApplicationContext接口或通过将引用转换为该接口的已知子类(例如ConfigurableApplicationContext,公开其他功能)来以编程方式操纵创建它们的bean 。一种用途是通过编程方式检索其他bean。有时,此功能很有用。但是,通常应避免使用它,因为它将代码耦合到Spring,并且不遵循控制反转样式,在该样式中,将协作者作为属性提供给bean。

ApplicationContext提供的其他方法提供对文件资源的访问,发布应用程序事件以及访问MessageSource。

自动装配是获得对ApplicationContext的引用的另一种方法。

传统的 constructorbyType自动装配模式(在所描述的自动装配协作者)可以提供类型的依赖 ApplicationContext于构造器参数或设置器方法参数。

要获得更大的灵活性,包括能够自动连接字段和使用多个参数方法,请使用基于注释的自动装配功能。如果您这样做,则将ApplicationContext自动将其连接到需要该ApplicationContext类型的字段,构造函数参数或方法参数中(如果相关的字段,构造函数或方法带有@Autowired注释)。

当ApplicationContext创建一个实现该 org.springframework.beans.factory.BeanNameAware接口的类时,该类将获得对其关联对象定义中定义的名称的引用。以下清单显示了BeanNameAware接口的定义:

public interface BeanNameAware {

    void setBeanName(String name) throws BeansException;
}

其他Aware介面

除了ApplicationContextAware和BeanNameAware,Spring还提供了各种各样的Aware回调接口,这些接口使bean可以向容器指示它们需要某种基础结构依赖性。通常,名称表示依赖项类型。下表总结了最重要的Aware接口:

ApplicationContextAware:声明ApplicationContext。
ApplicationEventPublisherAware:事件发布者。
BeanClassLoaderAware:类加载器,用于加载Bean类。
BeanFactoryAware:声明BeanFactory。
BeanNameAware:声明bean的名称。
LoadTimeWeaverAware:用于在加载时处理类定义。
MessageSourceAware:解决消息的已配置策略(支持参数化和国际化)。
NotificationPublisherAware:Spring JMX通知发布者。
ResourceLoaderAware:配置的加载程序,用于对资源的低级别访问。
ServletConfigAware:当前ServletConfig容器在其中运行。仅在可感知网络的Spring ApplicationContext中有效。
ServletContextAware:当前容器在ServletContext中运行。仅在可感知网络的Spring ApplicationContext中有效。

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-extension

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容

  • 注意LifecycleProcessor接口继承了Lifcycle接口。同时,增加了2个方法,用于处理容器的ref...
    google666s阅读 1,113评论 0 51
  • Spring入门使用Spring容器Spring容器使用ApplicationContextApplication...
    渐丶忘阅读 1,410评论 0 4
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 4,172评论 2 7
  • Spring框架官网下载教程:https://blog.csdn.net/saszyl/article/detai...
    惜小八阅读 592评论 0 1
  • 今天东京动漫展上出了条大新闻,奥特曼要加入漫威了。。。 我滴个乖乖,这个架还咋打?一脚下去就团灭了吧?接下来的故事...
    Ethan____阅读 204评论 1 1