注解@PostConstruct与@PreDestroy详解及实例

简介: 注解@PostConstruct与@PreDestroy详解及实例

简介

Java EE5 引入了@PostConstruct和@PreDestroy这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作。此文主要说明@PostConstruct。


API使用说明

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


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


总结为一下几点:


只有一个方法可以使用此注释进行注解;

被注解方法不得有任何参数;

被注解方法返回值为void;

被注解方法不得抛出已检查异常;

被注解方法需是非静态方法;

此方法只会被执行一次;

Servlet执行流程图

两个注解加入只会,Servlet执行流程图:


image.png

在具体Bean的实例化过程中,@PostConstruct注释的方法,会在构造方法之后,init方法之前进行调用。


实例

基于Spring boot编写的可执行方法见github:https://github.com/HappySecondBrother/example

UserService方法(提供缓存数据):

package com.secbro.service;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * @author 二师兄
 * @date 2016/8/10
 */
@Service
public class UserService {
    public List<String> getUser(){
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        return list;
    }
}

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

package com.secbro.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
/**
 * @author 二师兄
 * @date 2016/8/10
 */
@Service
public class BusinessService {
    @Autowired
    private UserService userService;
    private List<String> list = null;
    /**
     * 构造方法执行之后,调用此方法
     */
    @PostConstruct
    public void init(){
        System.out.println("@PostConstruct方法被调用");
        // 实例化类之前缓存获得用户信息
        List<String> list = userService.getUser();
        this.list = list;
        if(list != null && !list.isEmpty()){
            for(String user : list){
                System.out.println("用户:" + user);
            }
        }
    }
    public BusinessService(){
        System.out.println("构造方法被调用");
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
}

执行结果:


构造方法被调用

@PostConstruct方法被调用

用户:张三

用户:李四


项目应用

在项目中@PostConstruct主要应用场景是在初始化Servlet时加载一些缓存数据等。


注意事项

使用此注解时会影响到服务的启动时间。服务器在启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。


目录
相关文章
|
23天前
|
Java Spring 容器
ServiceLocatorFactoryBean获取Bean方法
在上述示例中,`MyService`是要获取的具体Bean的类型。通过配置 `ServiceLocatorFactoryBean`,定义 `ServiceLocator`接口和实现类,然后通过获取 `MyServiceLocator`实例并调用方法,可以从Spring容器中获取特定类型的Bean。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
13 0
|
5月前
|
Java Spring 容器
@PostConstruct使用
@PostConstruct使用
28 0
|
5月前
获取类中所有的bean
获取类中所有的bean
25 0
|
Java Spring 容器
springboot 静态方法中使用@Autowired注入配置和Bean
springboot 静态方法中使用@Autowired注入配置和Bean
Zp
@PostConstruct注解作用
@PostConstruct注解作用
Zp
118 0
|
开发框架 Java 应用服务中间件
一文带你深入理解SpringBean生命周期之PostConstruct、PreDestroy详解
一文带你深入理解SpringBean生命周期之PostConstruct、PreDestroy详解
259 0
一文带你深入理解SpringBean生命周期之PostConstruct、PreDestroy详解
SpringAOP导致@Autowired依赖注入失败
SpringAOP导致@Autowired依赖注入失败
159 1
|
缓存 Java Spring
Spring 源码阅读 45:@PostConstruct 和 @PreDestroy 注解的处理
本文介绍了 InitDestroyAnnotationBeanPostProcessor 后处理器对`@PostConstruct`和`@PreDestroy`注解方法的解析和处理原理。
108 0
|
XML 缓存 Java
Spring - @PostConstruct & @PreDestroy
Spring - @PostConstruct & @PreDestroy
147 0
Spring - @PostConstruct & @PreDestroy
通过实现ApplicationContextAware接口获取Bean
通过实现ApplicationContextAware接口获取Bean
115 0