简介Java EE5 引入了@PostConstruct和@PreDestroy这两个作用于类的生命周期的注解,实现类执行构造函数之后和销毁之前的自定义操作。此文主要说明@PostConstruct。

    API使用说明
    以下为@PostConstruct的API使用说明:

    PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PostConstruct 的方法可以是 public、protected、package private 或 private;除了应用程序客户端之外,该方法不能是 static;该方法可以是 final;如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。

    总结为一下几点:

    只有一个方法可以使用此注释进行注解;
    被注解方法不得有任何参数;
    被注解方法返回值为void;
    被注解方法不得抛出已检查异常;
    被注解方法需是非静态方法;
    此方法只会被执行一次;
    实例
    基于Spring boot编写的可执行方法见github:https://github.com/HappySecondBrother/example UserService方法(提供缓存数据):

    1. package com.secbro.service;
    2. import org.springframework.stereotype.Service;
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. /**
    6. * @author 二师兄
    7. * @date 2016/8/10
    8. */
    9. @Service
    10. public class UserService {
    11. public List<String> getUser(){
    12. List<String> list = new ArrayList<>();
    13. list.add("张三");
    14. list.add("李四");
    15. return list;
    16. }
    17. }

    BusinessService方法,通过@PostConstruct调用UserService:

    1. package com.secbro.service;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.stereotype.Service;
    4. import javax.annotation.PostConstruct;
    5. import java.util.List;
    6. /**
    7. * @author 二师兄
    8. * @date 2016/8/10
    9. */
    10. @Service
    11. public class BusinessService {
    12. @Autowired
    13. private UserService userService;
    14. private List<String> list = null;
    15. /**
    16. * 构造方法执行之后,调用此方法
    17. */
    18. @PostConstruct
    19. public void init(){
    20. System.out.println("@PostConstruct方法被调用");
    21. // 实例化类之前缓存获得用户信息
    22. List<String> list = userService.getUser();
    23. this.list = list;
    24. if(list != null && !list.isEmpty()){
    25. for(String user : list){
    26. System.out.println("用户:" + user);
    27. }
    28. }
    29. }
    30. public BusinessService(){
    31. System.out.println("构造方法被调用");
    32. }
    33. public List<String> getList() {
    34. return list;
    35. }
    36. public void setList(List<String> list) {
    37. this.list = list;
    38. }
    39. }

    执行结果:

    构造方法被调用
    @PostConstruct方法被调用
    用户:张三
    用户:李四