`

注解@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执行流程图: 
这里写图片描述

在具体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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

执行结果:

构造方法被调用
@PostConstruct方法被调用
用户:张三
用户:李四
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

项目应用

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

注意事项

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

分享到:
评论

相关推荐

    Spring Bean的初始化和销毁实例详解

    Spring Bean的初始化和销毁实例详解 Spring Bean的初始化和销毁是Spring框架中一个非常重要的概念,它们都是Bean生命周期中不可或缺的一部分。在Spring框架中,我们可以使用多种方式来控制Bean的初始化和销毁,以下...

    Spring @compenent注解详解

    `@PostConstruct`和`@PreDestroy`注解分别标识初始化和销毁方法,Spring会在Bean实例化后调用`@PostConstruct`方法,在销毁前调用`@PreDestroy`方法。 8. **生命周期回调** 除了初始化和销毁方法,Spring还提供了...

    Spring Annotation (注解)详解

    如`@Repository`(用于数据访问层)、`@Value`(注入值)、`@Scope`(指定Bean的作用域)、`@PostConstruct`和`@PreDestroy`(标记初始化和销毁方法)等,它们共同构建了一个强大的注解配置体系。 综上所述,Spring...

    Spring注解详解

    9. `@PostConstruct`和`@PreDestroy`:分别标记初始化和销毁方法,在bean生命周期中的特定时刻执行。 10. `@Repository`:标记数据访问层组件,主要用于异常转换,将数据库操作的异常转换为应用程序友好的异常。 ...

    spring和Struts2注解文档

    ##### 1.2.9 @PostConstruct和@PreDestroy注解 用于标记生命周期回调方法,`@PostConstruct`在初始化后调用,`@PreDestroy`在销毁前调用。 ##### 1.2.10 @Repository注解 用于标注数据访问层的组件,提供对数据库...

    使用 Spring 2_5 注释驱动的 IoC 功能.mht

    **Spring 2.5 注释驱动的 IoC 功能详解** Spring 框架自 2.5 版本开始引入了对注解的强大支持,极大地简化了依赖注入(Dependency Injection,简称 DI)的配置过程。注解驱动的 IoC(Inverse of Control,控制反转...

    Spring注解笔记

    ### Spring注解详解 #### 一、Spring注解概述 Spring框架从2.5版本开始引入了一套基于注解的配置方式,极大地简化了开发人员的工作量,使得配置变得更加直观和简洁。本篇将详细介绍Spring中常用的注解及其应用场景...

    spring注解

    ### Spring注解详解 #### 一、Spring注解概述 Spring框架自2.5版本起引入了大量的注解支持,这标志着Spring向着更加简洁、高效的方向发展。注解配置相较于传统的XML配置具有诸多优势: 1. **减少配置工作量**:...

    springmvc注解

    ### Spring MVC 注解详解 #### 引言 在现代Java Web开发中,Spring MVC框架以其强大的功能和灵活性占据了举足轻重的地位。其中,注解是实现其诸多特性的重要手段之一。本文旨在全面解析Spring MVC中常用的注解,...

    EJB 3.0实例教程.pdf

    EJB 3.0规范定义了bean的生命周期方法,如`@PostConstruct`和`@PreDestroy`,使得开发者可以自定义bean初始化和销毁时的行为。 通过以上这些特性,EJB 3.0使得企业级Java开发变得更加简单和高效。《EJB 3.0实例教程...

    Spring中基于Java的配置@Configuration和@Bean用法详解

    除了基本的Bean定义和依赖注入,`@Configuration`和`@Bean`还支持更多的高级特性,如条件化Bean创建(`@Conditional`)、Bean的作用域(`@Scope`)、Bean的初始化和销毁方法(`@PostConstruct`和`@PreDestroy`)以及...

    ejb 学习笔记

    - **生命周期管理**:由EJB容器负责,包括创建、初始化、销毁实例以及回调特定生命周期方法,如`@PostConstruct`和`@PreDestroy`,以确保资源的有效管理和清理。 ##### 有状态会话Bean - **特点**:需要维护与特定...

    EJB3 实例程序

    4. **简化生命周期**:EJB3取消了旧版本中的生命周期回调方法,如`ejbCreate()`和`ejbRemove()`,改用`@PostConstruct`和`@PreDestroy`注解来标记初始化和清理操作。 5. **简化事务管理**:EJB3提供了一种声明式...

    Spring面试宝典 不看后悔

    - **`@PostConstruct` 和 `@PreDestroy` 注解** - `@PostConstruct` 用于标记初始化方法,在Bean初始化后执行。 - `@PreDestroy` 用于标记销毁方法,在Bean销毁前执行。 #### 五、声明式事务管理 - **`@...

    详解 Spring 3.0 基于 Annotation 的依赖注入实现

    - `@PostConstruct` 和 `@PreDestroy` 注解用于标记在 Bean 初始化后和销毁前执行的方法。 6. **自定义注解**: - 用户可以创建自定义注解,并在其上使用 `@Component`,使其具有类似的功能。但这并不常见,因为 ...

    Spring注解驱动开发.pdf

    ### Spring注解驱动开发知识点详解 #### 一、Spring注解驱动概述 Spring框架通过引入注解支持,极大地简化了Java EE应用的开发工作。它不仅提供了基础的依赖注入功能,还增强了对组件扫描的支持,使得开发者能够...

    Bean的生命周期介绍

    ### Bean的生命周期详解 在Spring框架中,Bean的生命周期是一个重要的概念,它涉及到Bean的创建、初始化以及销毁等过程。了解这些过程对于更好地利用Spring框架的功能具有重要意义。 #### Bean的创建 Bean的创建...

    ejb-3_0最新规范

    实体Bean的生命周期在EJB 3.0中得到了简化,通过@PostConstruct和@PreDestroy注解,开发者可以在Bean实例初始化后和销毁前执行自定义逻辑。 5. **事务管理** EJB 3.0提供了一种声明式事务管理方式,允许开发者...

Global site tag (gtag.js) - Google Analytics