@PostConstruct 注解

  @PostConstruct 注解用于标记一个方法,该方法需要在依赖注入完成后执行,以完成任何初始化操作。​​此方法必须在类投入使用之前被调用​​。所有支持依赖注入的类都必须支持此注解。即使类没有请求任何资源注入,也必须调用标注了 @PostConstruct 的方法。​​一个类上只能有一个方法被标注此注解​​。(翻译自官方解释)

一、作用

@PostConstruct 注解的主要作用是:

  • ​在依赖注入完成后执行初始化逻辑​​:比如初始化资源、加载配置、建立数据库连接池、启动定时任务等。
  • ​确保对象在使用前已经完成必要的初始化​​,避免在业务代码中手动调用初始化方法。

二、使用场景

以下是一些典型的使用场景: 

  1. ​初始化资源​​:比如加载配置文件、初始化缓存、连接数据库等。

    import javax.annotation.PostConstruct;
    import javax.sql.DataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class DatabaseInitializer {
    
        @Autowired
        private DataSource dataSource; // 假设是通过 Spring 注入的数据源
    
        @PostConstruct
        public void initDatabaseConnectionPool() {
            System.out.println("初始化数据库连接池...");
            // 这里可以执行一些连接池的初始化逻辑,比如测试连接是否可用
            // 实际项目中可能会调用 dataSource 的一些方法来验证连接
            System.out.println("数据库连接池初始化完成!");
        }
    }
  2. ​执行一次性初始化任务​​:比如启动定时任务、注册监听器、预加载数据等。

    import javax.annotation.PostConstruct;
    import org.springframework.stereotype.Component;
    
    @Component
    public class CacheInitializer {
    
        @PostConstruct
        public void preloadCache() {
            System.out.println("开始预加载数据到缓存...");
            // 模拟从数据库加载数据到缓存
            // 比如:List dataList = dataService.getAllData();
            // cache.putAll(dataList);
            System.out.println("缓存预加载完成!");
        }
    }
  3. ​依赖注入后的校验或设置​​:在依赖注入完成后,对某些属性进行校验或进一步设置。

    import javax.annotation.PostConstruct;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ConfigValidator {
    
        @Value("${app.max.users:100}") // 从配置文件中读取属性,默认值 100
        private int maxUsers;
    
        @PostConstruct
        public void validateConfig() {
            System.out.println("开始校验配置参数...");
            if (maxUsers <= 0) {
                throw new IllegalArgumentException("配置参数 app.max.users 必须大于 0");
            }
            System.out.println("配置参数校验通过,maxUsers = " + maxUsers);
        }
    }
  4. ​Spring Bean 的初始化​​:在 Spring 管理的 Bean 中,@PostConstruct 方法会在 Bean 的依赖注入完成后、Bean 被使用前被调用。

    import javax.annotation.PostConstruct;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyService {
    
        @Autowired
        private MyRepository myRepository;
    
        private boolean initialized = false;
    
        @PostConstruct
        public void init() {
            System.out.println("MyService 的 @PostConstruct 方法被调用,开始初始化...");
            // 模拟一些初始化操作,比如检查数据库连接、加载数据等
            if (myRepository != null) {
                System.out.println("依赖注入成功,myRepository 已准备好!");
            } else {
                System.out.println("依赖注入失败!");
            }
            initialized = true;
            System.out.println("MyService 初始化完成!");
        }
    
        public void doSomething() {
            if (!initialized) {
                throw new IllegalStateException("Service 尚未初始化完成!");
            }
            System.out.println("执行业务逻辑...");
        }
    }

三、使用方式

@PostConstruct 注解标注的方法需要满足以下条件:

  • 方法​​不能有参数​​。
  • 方法​​返回类型必须是 void​。
  • 方法​​不能是 static 的​​。
  • 方法​​可以是 publicprotected 或 package-private(默认)​,但不能是 private(虽然技术上某些框架可能允许,但不推荐)。
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class MyService {

    @PostConstruct
    public void init() {
        System.out.println("MyService 初始化完成,执行初始化逻辑...");
        // 比如加载配置、初始化资源等
    }

    public void doSomething() {
        System.out.println("执行业务逻辑...");
    }
}

你可能感兴趣的:(java中的常见注解,java,开发语言)