`

@PostConstruct和@PreDestroy

    博客分类:
  • web
 
阅读更多

转自:https://blog.csdn.net/wo541075754/article/details/52174900

 

简介

Java EE5 引入了@PostConstruct(javax.annotation.PostConstruct)和@PreDestroy(javax.annotation.PreDestroy)这两个作用于Servlet生命周期的注解(如下面例子中:依赖注入类中的方法也能用),实现Bean初始化之前和销毁之前的自定义操作。此文主要说明@PostConstruct。

API使用说明

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

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

总结为一下几点: 猜想原因是支持依赖注入的类在由框架实例化时,生成代理类,然后可能是在代理类构造方法末尾调用这个PostConstruct注释的方法(以上个人猜想)

  • 类中只有一个方法可以使用此注释进行注解;
  • 被注解方法不得有任何参数;
  • 被注解方法返回值为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;
    }
}

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包。

 

分享到:
评论

相关推荐

    java @PostConstruct和@PreConstruct注解

    在上面的示例中,我们使用了 @PostConstruct 和 @PreDestroy 注解来修饰两个方法:initMethod() 和 destroyMethod()。initMethod() 方法将在服务器加载 Servlet 的时候运行,而 destroyMethod() 方法将在服务器卸载 ...

    @PostConstruct 和 @PreDestroy 使用

    在Java世界中,`@PostConstruct` 和 `@PreDestroy` 是两个非常重要的注解,它们主要用于管理组件的生命周期,特别是在使用Spring框架或者Java EE应用中。这两个注解是JSR 250规范的一部分,提供了对bean初始化和销毁...

    Spring实战之使用@POSTConstruct和@PreDestroy定制生命周期行为操作示例

    `@POSTConstruct` 和 `@PreDestroy` 注解允许我们在Bean初始化完成后执行特定的操作,并在Bean销毁之前执行清理工作。本示例详细介绍了如何在Spring中使用这两个注解来定制Bean的生命周期行为。 首先,让我们了解...

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

    在本文中,我们详细讲解了Spring Bean的初始化和销毁,包括使用@Bean的initMethod和destroyMethod、JSR-250的@PostConstruct和@PreDestroy注解等多种方式来控制Bean的生命周期。在实际开发中,我们可以根据需要选择...

    14、加载spring启动首先进入的类方法注解1

    本文将详细讨论在Spring中使用`@PostConstruct`和`@PreDestroy`注解以及`InitializingBean`和`DisposableBean`接口来控制Bean的生命周期。 1. **使用@PostConstruct和@PreDestroy注解** `@PostConstruct`注解标记...

    Spring注解@Component、@Repository、@Service、@Controller区别.doc

    在这里,我们使用 @PostConstruct 和 @PreDestroy 注解来指定组件的初始化和销毁方法,这样可以在组件的生命周期中执行特定的操作。 @Component、@Repository、@Service、@Controller 等注解是 Spring 框架中常用的...

    javax.annotation-3.1.2.2-sources.jar.zip

    例如,通过@PostConstruct和@PreDestroy管理对象的生命周期,通过@Resource和@Inject实现依赖注入,通过@ManagedBean简化Java EE应用的配置,以及通过@NotNull进行数据校验,防止空指针异常。 总之,javax....

    计算机二级java资料.pdf

    首先,@PostConstruct和@PreDestroy是Java EE规范定义的两个注解,它们分别用于标记在Session Bean生命周期中的特定时刻执行的方法。@PostConstruct注解的方法会在Session Bean的构造函数执行后,由EJB容器调用来...

    浅尝Spring注解开发_Bean生命周期及执行过程.doc

       3.@PostConstruct 和 @PreDestroy 注解 Spring 也支持在方法上使用这些注解来标识初始化和销毁方法。`@PostConstruct` 标记的方法会在所有依赖注入完成后调用,而 `@PreDestroy` 标记的方法会在容器关闭前...

    开源框架面试专题及答案.pdf

    Spring Bean 的生命周期 &gt; Spring Bean 的生命周期简单易懂。在一个 bean 实例被初始化时,需要执行一系列的初 始化操作以达到可用的状态。同样的,当一个 bean 不在被调用...&gt; @PostConstruct 和@PreDestroy 注解方式

    spring annotation 入门

    5. **@PostConstruct 和 @PreDestroy** - **定义**: - `@PostConstruct`:用于标记在构造器初始化之后立即执行的方法。 - `@PreDestroy`:用于标记在对象销毁前调用的方法。 - **作用**: - `@PostConstruct`...

    Spring的自动扫描注入.docx

    在 Spring 框架中,可以使用 @PostConstruct 和 @PreDestroy 注解来指定初始化和销毁方法。例如: @PostConstruct public void init() { } @PreDestroy public void destory() { } Spring 的自动扫描注入机制可以...

    spring中service生命周期(xml/annotation)

    对应XML中的初始化和销毁方法,Spring注解提供了`@PostConstruct`和`@PreDestroy`,分别表示初始化和销毁时执行的方法: ```java @Service public class UserService { @PostConstruct public void init() { //...

    Spring IOC之方法注入

    总结来说,Spring的IoC方法注入提供了一种灵活的方式来管理和初始化对象,通过`@PostConstruct`和`@PreDestroy`注解,或者实现`InitializingBean`和`DisposableBean`接口,我们可以在对象生命周期的关键点执行特定的...

    Springboot启动扩展点详细总结.docx

    理解这些阶段,可以让我们更好地利用自动装配,定制 Bean 的初始化和销毁行为,例如通过 @PostConstruct 和 @PreDestroy 注解来指定初始化和销毁方法。 2. **ApplicationContextInitializer** 在 Spring 容器初始...

    spring的配置注解

    `@PostConstruct`和`@PreDestroy`注解分别用于标记初始化方法和销毁方法,它们会在Bean创建后和销毁前被调用。 ```java @Service public class UserService { @PostConstruct public void init() { // 初始化...

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

    6. **@PostConstruct 和 @PreDestroy:** 这两个注解分别标记初始化和销毁方法。`@PostConstruct` 在 bean 初始化完成后调用,`@PreDestroy` 在 bean 销毁前调用。例如: ```java @Component public class ...

    SpringBoot之Bean的使用及处理

    9. **Bean的生命周期回调**:除了@PostConstruct和@PreDestroy,还可以使用ApplicationListener监听ApplicationContext事件,例如启动和关闭事件,进行自定义操作。 10. **Bean的优先级**:在多个Bean满足同一类型...

    spring2.0学习笔记+spring定时任务

    Spring 2.0是该框架的一个里程碑版本,引入了许多新特性,如支持JSR-250(例如@PostConstruct和@PreDestroy注解),改进的AOP支持,以及对Java Persistence API(JPA)和Hibernate的集成。 在Spring 2.0中,我们...

Global site tag (gtag.js) - Google Analytics