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

简介

 

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

 

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

API使用说明

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

1. PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。

2. 此方法必须在将类放入服务之前调用。

3. 支持依赖关系注入的所有类都必须支持此注释。

4. 即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。

5. 只有一个方法可以用此注释进行注释。

 

6. 应用 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;}
}

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 {@Autowiredprivate UserService userService;private List<String> list = null;/*** 构造方法执行之后,调用此方法*/@PostConstructpublic 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包。

 

-------------------------------------------------- 我是分隔线  ----------------------------------------------------------------

 

关于在 spring  容器初始化 bean 和销毁前所做的操作定义方式有三种:

第一种:通过 @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁 bean 之前进行的操作

第二种:通过 在 xml 中定义 init-method 和  destory-method 方法

第三种: 通过 bean 实现 InitializingBean 和 DisposableBean 接口

 

转自:https://blog.csdn.net/topwqp/article/details/8681497

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别让6种不良心理偷走你的好人缘

众所周知&#xff0c;拥有正常、健康的交际圈对于人的身心健康都是很有帮助的。但是若想维系好自己的交际圈&#xff0c;也是很不容易的&#xff0c;甚至在不经意间产生的某些心理&#xff0c;就会直接给大家的人际交往带来影响。那么接下来&#xff0c;小编就先为大家归纳一下…

PHP 安装xdebug

xdebug官网: https://xdebug.org 安装步骤如下: 使用 phpinfo() 打印出PHP相关信息, 全选, 复制 打开 xdebug 网站: https://xdebug.org/wizard.php 在图中输入框中粘贴你复制的信息, 点击 Analyse my phpinfo() output 在结果中点击下载, 然后按照它提示的步骤进行操作即可…

apt-clone:备份已安装的软件包并在新的 Ubuntu 系统上恢复它们

当我们在基于 Ubuntu/Debian 的系统上使用 apt-clone&#xff0c;包安装会变得更加容易。如果你需要在少量系统上安装相同的软件包时&#xff0c;apt-clone 会适合你。 如果你想在每个系统上手动构建和安装必要的软件包&#xff0c;这是一个耗时的过程。它可以通过多种方式实现…

分布式消息中间件 : Rocketmq

简述 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 分布式消息中间件&#xff0c;主要是实现分布式系统中解耦、异步消息、流量销锋、日志处理等场景。生产中用的最多的消息队…

PV、UV、UIP、VV、CPC、CPM、RPM、CTR指的是什么?

PV(PageView)&#xff1a;网站浏览量&#xff0c;指页面的浏览次数&#xff0c;用以衡量网站用户访问的网页数量。用户没打开一个页面便记录1次PV&#xff0c;多次打开同一页面则浏览量累计&#xff1b;UV(UniqueVistor)&#xff1a;独立访客数&#xff0c;指1天内访问某站点的…

linux opencl(AMD) Example

最近对并行计算很感兴趣。不过搞MPI对我来说暂时没什么用&#xff0c;基于GPU的并行计算倒是挺实用。网上的资料都是CUDA的。实质上我对CUDA一点兴趣都没有。无论别人的架构多么先进&#xff0c;我这个只有AMD显卡的小孩都是旁观者而已。在这里记录一下一个opencl程序的编译过程…

php使用supervisor管理进程脚本

supervisor是用python开发的一个在linux系统下的进程管理工具&#xff0c;可以方便的监听&#xff0c;启动&#xff0c;停止一个或多个进程。当一个进程被意外杀死后&#xff0c;supervisor监听到后&#xff0c;会自动重新拉起进程。 一、supervisor的安装 1、通过easy_install…

重写规则和重载规则

重写规则&#xff1a; 发生在有继承关系的类之间&#xff08;同一类就是重载了&#xff09;相同的方法名&#xff0c;参数列表&#xff0c;返回类型可见性&#xff08;public,protected,private&#xff09;不能被缩小异常不能被放大规则与c中不一样静态类型不能被重写方法重载…

消息中间件:RocketMQ 介绍(特性、术语、原理、优缺点、消息顺序、消息重复)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 消息中间件的作用 1. 应用解耦 2. 异步处理 比如用户注册场景&#xff0c;注册主流程完成以后&#xff0c;需要调用邮件系统发送邮件…

C# JsonHelper类

记录一下&#xff0c;方便下次用。 public class JsonHelper{#region Json/// <summary>/// JavaScriptSerializer/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <returns&…

[译】Redux入门教程(一)

前言 老外写技术文章真是叼&#xff0c;这是国外的一个程序员写的一个简单易懂,循序渐进的Redux教程&#xff0c;本着共享的精神&#xff0c;就翻译出来给大家一起看&#xff0c;文章最后有链接&#xff0c;不想看我翻译的直接去看原文吧。 下面是原教程的英文目录 这篇先更三分…

使用 Intellij Idea 打包 java 工程为可执行 jar 包

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 其实还有个简单多了方法&#xff0c;见&#xff1a; 超简单方法&#xff1a; Intellij Idea 把 java 工程打成可运行的 jar 步骤&#x…

QuickStart系列:docker部署之Gitlab本地代码仓库

gitlab是可以在本地搭建的使用git作为源代码管理的仓库。 运行环境&#xff1a; win10vmware14docker7docker 1. 使用命令拉取镜像&#xff08;非必须&#xff0c;耗时比较久&#xff0c;这里以ce为准&#xff0c;ce是社区版&#xff0c;ee是企业版&#xff09;&#xff1a; do…

超简单方法: Intellij Idea 把 java 工程打成可运行的 jar

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 找到 Intellij Idea 最下面的 Terminal 选项&#xff0c;并点击进入该界面。 2. 在光标位置输入命令&#xff1a;mvn clean 。清理…

LDAP-轻量级目录访问协议(统一认证)

概念 LDAP是轻量目录访问协议&#xff0c;英文全称是Lightweight Directory Access Protocol&#xff0c;一般都简称为LDAP。 参考资料 LDAP概念和原理介绍 我花了一个五一终于搞懂了OpenLDAP LDAP-Apache Directory Studio使用&#xff08;创建DC.OU及用户&#xff09; 转载于…

kafka集群搭建(消息)

1、Kafka使用背景在我们大量使用分布式数据库、分布式计算集群的时候&#xff0c;是否会遇到这样的一些问题&#xff1a;我们想分析下用户行为&#xff08;pageviews&#xff09;&#xff0c;以便我们设计出更好的广告位我想对用户的搜索关键词进行统计&#xff0c;分析出当前的…

[转]在Windows 下使用OpenCL

目前&#xff0c;NVIDIA和AMD的Windows driver均有支援OpenCL&#xff08;NVIDIA的正式版driver是从195.62版开始&#xff0c;而AMD则是从9.11版开始&#xff09;。NVIDIA的正式版driver中包含OpenCL.dll&#xff0c;因此可以直接使用。AMD到目前为止&#xff0c;则仍需要安装其…

docker 之 Dockerfile 实践

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 上一篇介绍了Dockerfile中使用的指令&#xff0c;现在开始进行指令实践 先查看下本地的镜像&#xff0c;选一个作为base image&#xf…

tomcat启动后命令行日志中文乱码

这是日志的编码设置和窗体的编码格式不一致。 将 conf\logging.properties 文件中的 UTF-8 改成 GBK 重启tomcat &#xff08;右键cmd标题栏部分&#xff0c;可以查看cmd属性&#xff09; 转载于:https://www.cnblogs.com/Echiops/p/10974587.html

Coursera机器学习笔记(一) - 监督学习vs无监督学习

转载 http://daniellaah.github.io/2016/Machine-Learning-Andrew-Ng-My-Notes-Week-1-Introduction.html 一. 监督学习 什么是监督学习? 我们来看看维基百科中给出的定义: 监督式学习&#xff08;英语&#xff1a;Supervised learning&#xff09;&#xff0c;是一个机器学习…