Bean生命周期,bean作用域

 两种管理方法

spring提供两种管理对象生命周期的方式:

1.注解方式

@postconstruc,在启动,当所有依赖都已经注入后,会调用这个方法

·· 构造方法注入——>setter注入——>调用@poststruct

@predestroy 在关闭时,在销毁bean实例之前,会调用这个方法

·· 1)仅当应用程序正常关闭时会调用@preDestroy方法,如果进程意外终止或强制终止则不会调用

2)JVM调用Hook(钩子)的shutdwon。exit()方法是也会调用@preDetroy

被添加注解的方法,可以是任意可以见性的,但是必须没有参数,而且返回值类型必须是void

@scope(prototype),每次使用都会创建一个对象,spring为了避免内存泄漏,不会缓存对象引用,所以spring关闭时候就无法处理对象的销毁方法了,不会调用@preDetory

2.@bean管理方法名

intiMethod属性引用的方法在创建对象以后执行

destroyMethod属性应用的方法在容器关闭时候执行

如果是自己的类,使用@@

如果不是自己的类,就只用bean方法

初始化

1.加载并后处理bean的定义

配置类已经处理了 并且/或且扫描添加了@Component注解的类

Bean的定义添加到BeanFactory 每个都在其id和类型之下被索引

尤其是BeanFactoryPostProcessor的Bean被调用 能够修改任何Bean的定义

内部扩展点 :BeanFactoryPostProcessor

是一个接口

将转换应用于Bean定义,在实际创建对象之前

在Spring中提供的几个实用的实现 读取属性,注册自定义作用域

可以自己写(不常见)实现BeanFactoryPostProcessor接口,spring4.2之前是需要自己写的,现在由springBoot制动调用

当bean加载完之后需要修改:比如修改名字,排序,相互调用的注入顺序,统一的修改。

@propertySource 注解就是一个beanFactoryPostProcess的实现类

只需以平时创建Bean的方式来创建

使用@Bean方法定义

BeanFactoryPostProcessor是一个由Spring调用的内部Bean(不是由你的代码调用)

它需要在创建任何Bean之前运行, 建议使用静态@Bean方法,

2。执行bean的创建

实例化:构造方法注入,setter方法注入。都是依赖注入

各个Bean被依次创建

依赖注入和可选的,可能是后处理的

Bean的创建

创建时注入依赖项,每个单例Bean都饿汉式的实例化, 除非被标记为懒加载

接下来每个Bean都经历后处理阶段 BeanPostProcessors

现在Bean已完全初始化,且随时可用

通过id追踪直至上下文被销毁

初始化扩展点

Bean后处理的特殊事件

导致初始化方法被调用, 例如@PostConstruct、init-method

在内部Spring使用几个初始化器BPP,示例:CommonAnnotationBeanPostProcessor启用了@PostConstruct,@Resource……

BeanPostProcessor扩展点:后处理阶段

Spring中的重要扩展点

可以使用任何方式修改Bean实例, 强大的启用功能

将对每个Bean运行, 能在初始化之前和/或初始化之后修改Bean

实现BPP接口,实现两个方法, BeforeInit在初始化器之前执行, AfterInit在初始化器之后执行,

Bean后处理器实现了一个已知的接口

Spring提供了多种实现,你可以自己写(不常见)

一般来说实现初始化后的方法

使用

1.你的Bean只是个Bean,直接调用(没什么特别的)

2.你的Bean是一个代理,代理是在初始化阶段通过BeanPostProcessor创建的, Spring对JDK或CGLib代理都能支持

销毁

所有Bean被清理

任何已注册的@PreDestroy方法都被调用,释放的Bean到垃圾回收器去销毁

当任何Bean超出作用域也会发生这样的情况, 除了作用域是prototype的Bean

注意:仅当应用程序正常关闭时才会发生, 当进程被杀死或失败时不会发生

bean的作用域

@scope(scopeName = singleton)

@scope(scopeName = peorotypr)

应用如那件中的队形有着不同的生存范围:飞机大战中的小飞机和天空

singleton(单例):是值在一个应用软件运行期间某个类型的对象始终只有一个对对象的现象,比如飞机大战中的天空就是单例的,spring中当一个对象作用域是单例时候,任何时候从springioc容器中获得的对象都是同一个。在程序关闭时候才与程序一起销毁,其作用范围非常长,

prototype(原型):是值应用软件执行期间有多个类型的对象存在,比如飞机大战中的小飞机对象,就是多个实例,当spring中一个对象作用域是原型时候,每次springioc容器获得的对象都是新对象。作用范围很短

spring中默认情况下bean组件作用域是单例,也就是说任何时候调用getbean方法获得的对象都是同一个实例,这么设计优点是一个bean可以被复用,提高了内存资源利用率

spring常用的作用域

1.singtelon

2.prototype

3.session  web环境使用

3.request  web环境使用

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring框架中,Bean是指被Spring容器所管理的对象。当我们在Spring配置文件或注解中定义一个Bean时,这个Bean经历一系列的生命周期阶段,包括以下7个阶段: 1. 实例化Bean对象:当Spring容器启动时,根据配置文件或注解中的定义,创建Bean的实例。 2. 设置Bean的属性:Spring容器自动将配置文件或注解中定义的属性值设置到Bean实例中。 3. 调用Bean的初始化方法:如果Bean实现了InitializingBean接口或在配置文件或注解中指定了初始化方法,Spring容器在实例化和属性设置完成后调用Bean的初始化方法。 4. Bean已经可以使用:此时,Bean已经可以被其他对象所引用和使用。 5. 调用Bean的业务方法:在Bean被其他对象所引用和使用时,Spring容器自动调用Bean的业务方法。 6. 调用Bean的销毁方法:如果Bean实现了DisposableBean接口或在配置文件或注解中指定了销毁方法,Spring容器在关闭时自动调用Bean的销毁方法。 7. Bean被销毁:此时,Bean已经被Spring容器销毁,不再可用。 在Spring中,Bean的作用域定义了Bean实例的生命周期和使用范围。Spring框架提供了5种标准的作用域: 1. singleton:单例模式,一个Bean实例在整个应用程序中只创建一次。 2. prototype原型模式,每次请求Bean时都创建一个新的Bean实例。 3. request:每个HTTP请求都创建一个新的Bean实例,在请求结束后,Bean实例就销毁。 4. session:每个HTTP话都创建一个新的Bean实例,在话结束后,Bean实例就销毁。 5. global-session:在基于portlet的web应用中,每个portlet应用都创建一个新的Bean实例,在portlet应用结束后,Bean实例就销毁。 通过定义Bean的作用域,我们可以控制Bean实例的生命周期和使用范围,从而更好地管理应用程序中的对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值