1 应用场景
- @PostConstruct:想在spring中生成一个对象之后,完成一些初始化操作,而这些操作需要某些依赖注入,不能在构造方法执行,比如生成一个对象后,查询数据字典。使用@PostConstruct注解一个方法,这个方法将在依赖注入完成后执行一次,仅执行一次。
- @PreDestroy:spring中销毁一个对象前,释放一些资源等。
2 加载顺序
- spring中执行顺序:Constructor >> @Autowired >> @PostConstruct;
- 服务器加载Servlet -> servlet 构造函数的加载 -> postConstruct ->init(init是在service 中的初始化方法. 创建service 时发生的事件.) ->Service->destory->predestory->服务器卸载serlvet
3 代码示例
@Component
public class DbInit {
@Autowired
private UserRepository userRepository;
@PostConstruct
private void postConstruct() {
User admin = new User("admin", "admin password");
User normalUser = new User("user", "user password");
userRepository.save(admin, normalUser);
}
}
@Component
public class UserRepository {
private DbConnection dbConnection;
@PreDestroy
public void preDestroy() {
dbConnection.close();
}
}
4 Java9+
@PostConstruct 和@PreDestroy 是JavaEE的一部分,因为Java EE在Java9已经被标deprecated,并且在Java11移除,所以在Java11及以上版本要加如下注解:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>