生命周期——InitializingBean, DisposableBean

除了设置@Scope注解中的initMethod和destroyMethod属性来定义bean的初始化和销毁方法外。还可以通过类实现InitializingBean和DisposableBean接口来重写它们的destroy方法和afterPropertiesSet方法,指定组建的初始化和销毁方法。方法的执行顺序与在@Scope中使用的一致。

单实例运行结果:

多实例测试代码:

多实例运行结果:

### 关于Spring生命周期的面试问题及解答 #### 1. Spring Bean的生命周期有哪些阶段? Spring Bean的生命周期主要分为以下几个阶段: - **实例化 (Instantiation)**:当容器加载配置元数据并发现需要创建一个新的Bean实例时,会调用无参构造函数或工厂方法来完成对象初始化。 - **属性赋值 (Populate Properties)**:一旦实例被创建出来之后,就会设置该Bean对应的属性值。这一步骤依赖于配置文件中的定义以及@Autowired等注解实现自动化装配[^1]。 - **Aware接口回调**:如果实现了特定的`*Aware`接口(例如`ApplicationContextAware`, `BeanNameAware`),那么此时这些接口的方法会被调用以便让Bean获取到它所关心的信息资源。 - **初始化前处理 (Initialization Callbacks Before Initialization Methods/Post Processors)**:在此期间可能会有多个事件发生,比如通过`@PostConstruct`标注的方法被执行,或是由`InitializingBean.afterPropertiesSet()`触发的动作;另外还有可能涉及到一些前置处理器(`BeanPostProcessor.postProcessBeforeInitialization`)的操作。 - **初始化后处理 (After Initialization Post Processing)**:同样地,在这个时刻也会经历一系列操作,包括但限于`BeanPostProcessor.postProcessAfterInitialization`的应用程序逻辑扩展点。 - **可用状态 (Ready to Use)**:经过上述所有准备工作以后,现在这个Bean已经完全准备好供其他组件使用了。 - **销毁 (Destruction)**:对于单例作用域下的Beans来说,只有在关闭整个IoC容器的时候才会真正进入此环节;而对于原型(Prototype)类型的Beans,则是在每次请求结束之时即刻释放掉。这里通常涉及的是`DisposableBean.destroy()`, 或者是带有`@PreDestroy`标记的方法执行【注意这里的描述综合考虑了多种情况,并非直接来源于单一引用】。 #### 2. 如何自定义Bean的行为在其生命周期同阶段? 可以通过如下几种方式来自定义Bean在整个生命期内的表现形式: - 实现`InitializingBean`和`DisposableBean`接口,重写其中相应的方法; - 使用标准Java EE提供的JSR-250规范里的`@PostConstruct`与`@PreDestroy`两个注解来进行更细粒度控制; - 注册自己的`BeanPostProcessor`实现类,从而可以在任何目标Bean即将完成初始化前后对其进行额外加工改造。 #### 3. 单例(Singleton) vs 原型(Prototype) Beans之间有什么区别?这对它们各自的生命周期有何影响? 这两种同的作用范围决定了其各自独特的生存周期特点: - 对于Singleton而言,默认情况下每个应用上下文只会存在唯一的一个共享实例,而且它的创建时机取决于是否延迟加载(lazy-init),而论如何,直到容器彻底停止服务之前都会再次重建新的副本。因此,这种模式下Bean的销毁过程仅发生在最后清理阶段。 - Prototype则完全同——每当客户端向Spring申请此类Bean时都会新造出一个独立实体返回给使用者,这意味着每一次访问都相当于启动了一个全新的生命周期流程,自然也就存在所谓的“回收再利用”。所以针对这类短命个体没有必要去特别关注其终结事宜,因为那完全是随需应变的结果[^2]。 ```java // Singleton scoped bean example @Component @Scope("singleton") // This is actually redundant as singleton is the default scope. public class MySingletonBean { public void doSomething(){ System.out.println("I am a single instance."); } } // Prototype scoped bean example @Component @Scope("prototype") public class MyPrototypeBean { public void doSomethingElse(){ System.out.println("A new instance of me is created each time I'm requested."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值