什么是 InitializingBean

InitializingBean 是 Spring 自带的一个接口,用于定义 Bean 初始化后需要完成的额外操作。换句话说,当 Spring 完成 Bean 的依赖注入和创建后,如果某些属性需要根据具体业务逻辑动态赋值或者这一 Bean 有初始化需求,InitializingBean 可以帮助我们实现。

定义及关键方法

它很简单,只有一个方法需要实现:

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}



使用场景

  1. 动态完成对象属性的初始化: 在 Bean 的属性被赋值后,你可以基于这些属性完成其他初始化工作。
  2. 确保依赖 Bean 初始化后的逻辑正确性: 处理一些需要所有属性确定后的初始化任务(例如连接池的初始化、文件资源的加载)。

示例代码

假设我们有一个 数据库连接管理器,需要在属性注入后动态初始化连接池:

public class DatabaseConnectionPool implements InitializingBean {

    private String connectionUrl;
    private int poolSize;

    public DatabaseConnectionPool(String connectionUrl, int poolSize) {
        this.connectionUrl = connectionUrl;
        this.poolSize = poolSize;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化连接池
        System.out.println("Initializing connection pool...");
        System.out.printf("URL: %s, Pool size: %d%n", connectionUrl, poolSize);
        // 实际上可以完成诸如打开资源等任务
    }

    public void testConnection() {
        System.out.println("Testing database connection...");
    }
}

或者是

* Redis Key 序列化
* 这个类实现了一个用于 Redis 的 Key 序列化器。它的主要目的是将 Redis 的键(Key)进行序列化和反序列化操作,
* 并在此过程中添加一个自定义的前缀和进行编码处理。下面我们将详细分析它的整体设计和功能实现。
*
*
* RedisSerializer 是 Spring Data Redis 框架中的一个接口,用于定义如何将数据进行 序列化和反序列化。
* 在 Redis 中,所有存储的数据(包括键和值)都以 字节数组 (byte[]) 的形式传输和保存
@RequiredArgsConstructor
public class RedisKeySerializer implements InitializingBean, RedisSerializer<String> {

    private final String keyPrefix;

    private final String charsetName;

    private Charset charset;

    @Override
    public byte[] serialize(String key) throws SerializationException {
        String builderKey = keyPrefix + key;
        return builderKey.getBytes();
    }

    @Override
    public String deserialize(byte[] bytes) throws SerializationException {
        return new String(bytes, charset);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        charset = Charset.forName(charsetName);
    }
}