@PostConstruct

2023-10-03 16:24
文章标签 postconstruct

本文主要是介绍@PostConstruct,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

优质博文:IT-BLOG-CN

一、简介

如果需要在生成对象时就完成某些初始化操作,而且这些初始化操作又依赖于依赖注入@Autowired,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化。@PostConstruct注解的方法将会在依赖注入完成后被自动调用。类初始化调用顺序: Constructor >> @Autowired >> @PostConstruct

特点:
1、只有一个非静态方法能使用此注解;
2、被注解的方法不得有任何参数;
3、被注解的方法返回值必须为void
4、被注解方法不得抛出已检查异常;
5、此方法只会被执行一次;

@PostConstructJava自带的注解,在方法上添加该注解时,Spring容器初始化的时候会执行该方法。从Java EE5规范开始,Servlet中存在两个注解@PostConstruct@PreDestroy影响Servlet生命周期(加载-实例化-初始化-服务-销毁),这两个注解用来修饰非静态的void无参方法;

@PostConstruct@PreDestroy区别:
【1】@PostConstruct用于标记一个方法,在对象创建后立即执行。它通常用于执行一些初始化操作,例如初始化成员变量或建立数据库连接。
【2】@PreDestroy用于标记一个方法,在对象销毁之前执行。它通常用于执行一些清理操作,例如关闭数据库连接或释放资源。

总结来说,@PostConstruct用于在对象创建后执行初始化操作,而@PreDestroy用于在对象销毁前执行清理操作。这两个注解都是由依赖注入框架自动调用的,无需手动调用。

二、代码

@Service
public class UserAutoBookProcess{// 使用到了依赖注入对象@Autowiredprivate ChineseConfig chineseConfig;private Map<Integer, String> map = null;// 初始化方法@PostConstructpublic void init(){ImmutableMap.of(1, chineseConfig.getFirst(), 2, chineseConfig.getSecord());}
}

三、源码分析

@PostConstruct注解的实现原理是在Spring容器初始化时,会扫描所有标有该注解的方法,并调用它们。如下:@PostConstruct注解是一个标注在方法上的注解,用于标记一个方法是在bean实例化后被调用的方法。它的定义比较简单,没有任何实现代码。

@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}

下面我们来看一下Spring容器是如何扫描并调用@PostConstruct注解的方法的:Spring容器在初始化InitDestroyAnnotationBeanPostProcessor这个类的内部postProcessBeforeInitialization方法里对@PostConstruct这个注解进行识别, 然后通过反射, 对这个方法进行了调用。而postProcessBeforeInitialization这个方法的被调是在bean的初始化。

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata metadata = this.findLifecycleMetadata(bean.getClass());try {metadata.invokeInitMethods(bean, beanName);return bean;} catch (InvocationTargetException var5) {throw new BeanCreationException(beanName, "Invocation of init method failed", var5.getTargetException());} catch (Throwable var6) {throw new BeanCreationException(beanName, "Failed to invoke init method", var6);}
}

四、实战引用

【1】Redis工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class RedisUtil {private static RedisTemplate<Object, Object> redisTemplates;@Autowiredprivate RedisTemplate<Object, Object> redisTemplate;@PostConstructpublic void initialize() {redisTemplates = this.redisTemplate;}/*** 添加元素** @param key* @param value*/public static void set(Object key, Object value) {if (key == null || value == null) {return;}redisTemplates.opsForValue().set(key, value);}
}

这篇关于@PostConstruct的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620

相关文章

@postconstruct初始化的操作

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式: @PostConstruct Public void someMethod() {}

探究Spring Boot中@PostConstruct注解的使用场景

在Spring Boot开发过程中,了解和合理利用@PostConstruct注解是非常重要的。这个简单却强大的注解能够帮助开发者在依赖注入完成之后执行初始化逻辑,从而确保组件在使用前已经完全准备就绪。本文将深入探讨@PostConstruct注解的使用场景,并通过示例解释其在实际项目中的应用。 什么是@PostConstruct注解? @PostConstruct注解用于标记在依赖注入完成后

Spring InitializingBean、init-method以及@PostConstruct 执行顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种: 通过实现 InitializingBean 或 DisposableBean 接口来定制初始化之后/销毁之前的操作方法;通过 元素的 init-method 或 destroy-method 属性指定初始化之后 /销毁之前调用的操作方法

JDK9 Eclipse无法启动:java.lang.NoClassDefFoundError: javax/annotation/PostConstruct

配置JDK9以后Eclipse无法启动,日志如下: org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotation/PostConstructat ... 解决办法: 打开eclipse安装目录下的eclipse.ini文件, 例如D:\Program Fil

@PostConstruct注解原理解析

定义:     @PostContruct注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。     从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。 用法:   @PostConstru

JavaAPI之注释类型 PostConstruct

随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、QQ技术交流群(183198395)。 结构 javax.annotation 注释类型 PostConstruct   @Documented@Retention(value=RUNTIME)@Target(value=METHOD)public @interface PostCon

JAVA 使用@PostConstruct 启动失败失效的解决办法

一般在处理某些业务时需要使用到启动项目时就要缓存某些静态变量或者执行某些方法的情况,一般大家都是用 @PostConstruct 注解来实现。但是在某些情况下不起作用。 解决办法:             在类上加上 @Component注解,或者@Service注解就行。收工。

【spring】@PostConstruct和@PreDestroy注解学习

@PostConstruct和@PreDestroy介绍 @PostConstruct和@PreDestroy是Java EE(Enterprise Edition)和Java SE(Standard Edition)中的注解,它们用于指定一个bean在其生命周期的特定点应该执行的方法。 这两个注解是JSR250规范中提供的注解。 @PostConstruct: 这个注解用于标记一个

@PostConstruct注解实现在servlet启动的时候执行

参考:https://blog.csdn.net/qq360694660/article/details/82877222 @PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。 Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并

@PostConstruct注解的使用

今天在项目中用到了@PostConstruct这个注解,顺便整理一下这个注解的用法。 该注解说明 @PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。 通常我们会是在Spring框架中使用到@P