两种管理方法
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环境使用