Spring管理的bean初始化方法的三种方式,以及@PostConstruct不起作用的原因

探讨Spring框架中Bean的生命周期及其与@PostConstruct注解的关系。解释了@PostConstruct注解的工作原理,并解决了该注解在特定配置下不生效的问题。

1:Spring 容器中的 Bean 是有生命周期的spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法:

  • 通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
  • 通过<bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
  • 在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

2:@PostConstruct不起作用的原因


项目用的spring mvc框架,配置文件如下:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"
default-lazy-init="true">

我在service中的一个方法加上@PostConstruct注解,引用的是 javax.annotation.PostConstruct;

这个方法不是应该在初始化之前执行吗?现在却始终没有执行,求大神指点

解决方法:

@PostConstruct是在对象构造完成后调用init-method之前执行的,你在xml中default-lazy-init="true"申明了延迟初始化,意味着容器刚启动,如果这个bean没有被调用,是不会初始化的,自然也就不会调用@PostConstruct的方法

### Bean 初始化过程中的 `@PostConstruct` 和 `InitializingBean` 的区别 #### 来源与适用性 - `@PostConstruct` 是 Java EE 规范的一部分,但在 Spring 框架中也被广泛支持。它可以应用于任何类的方法上,不需要实现特定接口。 - `InitializingBean` 是 Spring 框架特有的接口,包含一个方法 `afterPropertiesSet()`,需要让 Bean 类实现该接口,并重写其中的方法来定义初始化逻辑[^3]。 #### 使用方式 - 对于 `@PostConstruct`,只需在希望在 Bean 初始化完成后执行的方法上添加此注解即可。这种方式更加简洁,易于理解和使用。 ```java @Component public class MyBean { @PostConstruct public void init() { // 初始化逻辑 } } ``` - 对于 `InitializingBean` 接口,需要让 Bean 类实现该接口,并重写 `afterPropertiesSet()` 方法来定义初始化逻辑。这种方式相对繁琐,但提供了更多控制权,特别是在不希望依赖 Java EE 规范的情况下。 ```java @Component public class MyBean implements InitializingBean { @Override public void afterPropertiesSet() { // 初始化逻辑 } } ``` #### 执行时机 - `@PostConstruct` 和 `InitializingBean` 的执行时机非常接近:它们都在依赖注入完成后立即执行,但在 Bean 完全初始化之前(即,Bean 可以使用其依赖,但尚未对外暴露)。 - 在具体的执行顺序中,`@PostConstruct` 注解修饰的方法会在 `InitializingBean` 接口的 `afterPropertiesSet()` 方法之前执行[^4]。 #### 灵活性 - `@PostConstruct` 提供了注解式的简洁语法,适合快速开发和简化代码结构。 - `InitializingBean` 接口虽然需要显式实现,但它避免了对 Java EE 规范的依赖,同时允许开发者更直接地控制初始化逻辑。 #### 总结 两种机制都可以用于在依赖注入完成后执行 Bean初始化逻辑,但 `@PostConstruct` 更加轻量且易于使用,而 `InitializingBean` 则提供了更强的框架独立性和更细粒度的控制能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值