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