返回顶部
首页 > 资讯 > 后端开发 > Python >@PostConstruct 注解分析
  • 554
分享到

@PostConstruct 注解分析

python开发语言javaspring后端性能优化面试 2024-01-21 16:01:59 554人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

一、简介 如果需要在生成对象时就完成某些初始化操作,而且这些初始化操作又依赖于依赖注入@Autowired,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成

一、简介

如果需要在生成对象时就完成某些初始化操作,而且这些初始化操作又依赖于依赖注入@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用于标记一个方法,在对象创建后立即执行。它通常用于执行一些初始化操作,例如初始化成员变量或建立数据库连接。

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

【2】@PreDestroy用于标记一个方法,在对象销毁之前执行。它通常用于执行一些清理操作,例如关闭数据库连接或释放资源。

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

@PostConstruct@PreDestroy这两个注解是Java5引入, 已经完全在Java11中删除. 使用需要引入jar

<dependency>
    <groupId>javax.annotationgroupId>
    <artifactId>javax.annotation-apiartifactId>
    <version>1.3.2version>
dependency>

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

注意事项: 在使用@PostConstruct注解时,需要注意以下几点:
【1】@PostConstruct注解时会影响服务启动时间,服务启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包;
【2】@PostConstruct注解在整个Bean初始化中执行的顺序:@Constructor(构造方法)-> @Autowired(依赖注入)->@PostConstruct(注解的方法);
【3】依赖注入完成后执行,@PostConstruct注解标记的方法将在依赖注入完成后执行。因此,在标记方法的同时,确保所需的依赖已经正确注入到对象中;
【4】方法签名和异常处理,被@PostConstruct注解标记的方法没有特定的方法签名要求,可以是任意访问修饰符、任意返回类型和任意参数列表。然而,建议遵循一致的方法命名和参数命名规范,以提高代码的可读性。此外,被@PostConstruct注解标记的方法应该尽量避免抛出异常。如果抛出异常,容器可能会在对象初始化过程中抛出异常并终止初始化;
【5】与构造函数的区别,@PostConstruct注解标记的方法在对象构造函数执行完成后调用,因此可以看作是构造函数之后的进一步初始化操作。与构造函数不同,@PostConstruct注解的方法可以访问依赖注入的成员变量,并执行更复杂的逻辑;
【6】跨平台兼容性,需要注意的是,@PostConstruct注解是JavaEE标准的一部分,在标准的JavaSE中也被引入。因此,几乎所有的JavaEE容器和一些常见的JavaSE容器都支持@PostConstruct注解。然而,为了确保跨平台兼容性,建议在使用之前进行适当的测试

二、代码

@Service
public class UserAutoBookProcess{
    // 使用到了依赖注入对象
	@Autowired
	private ChineseConfig chineseConfig;

    private Map<Integer, String> map = null;
 
	// 初始化方法
	@PostConstruct
	public 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工具类/初始化MQ/数据库连接/基础数据加载等。

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;
 
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;
 
    @PostConstruct
    public void initialize() {
        redisTemplates = this.redisTemplate;
    }
 
    
    public static void set(Object key, Object value) {
 
        if (key == null || value == null) {
            return;
        }
        redisTemplates.opsForValue().set(key, value);
    }
}

【2】我们写一个Demo感受下@PostConstruct服务器加载Servlet的时候运行指定方法,并且只运行一次。

@Component
public class PostConstructDemo {
    @PostConstruct
    public void testPostConstruct() {
        System.out.printf("==========PostConstruct test================");
    }
}

【3】@PostConstruct自定义定时任务的用法

@Controller
public class processTimeoutController {
    @Scheduled(cron = "0 * * * * ?")
    @PostConstruct
    public void processTimeoutMethod() {
        System.out.printf("===job====" + Calendar.getInstance().getTime());
    }
}

【4】配置加载和解析:在应用程序启动时,我们可能需要加载和解析一些配置文件,并将配置信息应用到相应的组件中。可以使用@PostConstruct注解来执行这些配置加载和解析的操作。

public class AppConfig {
    private Properties config;

    @PostConstruct
    public void init() {
        // 加载和解析配置文件
        config = // ...
    }
}

来源地址:https://blog.csdn.net/zhengzhaoyang122/article/details/135612793

--结束END--

本文标题: @PostConstruct 注解分析

本文链接: https://lsjlt.com/news/556213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • @PostConstruct 注解分析
    一、简介 如果需要在生成对象时就完成某些初始化操作,而且这些初始化操作又依赖于依赖注入@Autowired,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成...
    99+
    2024-01-21
    python 开发语言 java spring 后端 性能优化 面试
  • Spring框架中@PostConstruct注解详解
    目录初始化方式一:@PostConstruct注解初始化方式二:实现InitializingBean接口补充:@PostConstruct注释规则总结初始化方式一:@PostCons...
    99+
    2024-04-02
  • SpringBoot使用@PostConstruct注解导入配置方式
    目录使用@PostConstruct注解导入配置使用@PostConstruct注解,完成静态对象注入为什么static对象不可直接使用@Autowired注入?@PostConst...
    99+
    2024-04-02
  • 基于@PostConstruct注解的使用,解决向静态变量注入值
    目录@PostConstruct注解的使用,向静态变量注入值说说思路@PostConstruct和静态变量注入和spring初始化执行顺序关于spring初始化操作@PostCons...
    99+
    2024-04-02
  • PostConstruct注解标记类ApplicationContext未加载空指针
    目录序区别讲道理你这种写法是 可能出错的原因解决BeanFactoryPostProcessor 为什么能解决这个问题?源码分析序 今天Code Review的时候 看到其他项目 s...
    99+
    2022-11-13
    PostConstruct ApplicationContext ApplicationContext空指针
  • java注解与元注解实例分析
    这篇文章主要介绍“java注解与元注解实例分析”,在日常操作中,相信很多人在java注解与元注解实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java注解与元注解实例分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • springboot @PostConstruct无效的解决
    目录springboot@PostConstruct无效解决办法spring@PostConstruct的踩坑在springboot程序启动过程中出现一个问题springboot @...
    99+
    2024-04-02
  • springboot @PostConstruct无效怎么解决
    本篇内容主要讲解“springboot @PostConstruct无效怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot @PostConstruc...
    99+
    2023-06-21
  • Spring注解解析之@ImportResource的示例分析
    这篇文章给大家分享的是有关Spring注解解析之@ImportResource的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ImportResource1.1 定义包和类首先定义一个不会被Compo...
    99+
    2023-06-15
  • Java Autowired注解深入分析
    今天是正月初八,先祝大家新年快乐。前几天遇见了一次Autowired注入失败的问题,所以找时间研究了一下相关的Spring源码,分享一下。如果哪位大佬发现问题,请帮忙反馈。分享之前,...
    99+
    2023-01-31
    Java Autowired注解 Java Autowired
  • java注解的全面分析
    全面解析java注解Java中的常见注解 a.JDK中的注解    @Override 覆盖父类或者父接口的方法    @Deprecated 表示方法已经过时 &nbs...
    99+
    2023-05-31
    java 注解 ava
  • 详解Spring注解@Validated失效分析
    目录Controller 中使用 @Validated@Validated 是怎么生效的?MethodValidationInterceptor需要满足什么条件那么 Controll...
    99+
    2023-05-17
    Spring注解@Validated失效 Spring @Validated Spring注解
  • Java@GlobalLock注解详细分析讲解
    目录GlobalLock的作用全局锁为什么要使用GlobalLock工作原理GlobalLock的作用 对于某条数据进行更新操作,如果全局事务正在进行,当某个本地事务需要更新该数据时...
    99+
    2022-11-21
    Java @GlobalLock Java @GlobalLock注解
  • Android注解框架对比分析
    Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上。然后你可以写一个注解处理器去解析处理...
    99+
    2022-06-06
    框架 Android
  • Java注解应用实例分析
    今天小编给大家分享一下Java注解应用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.注解的理解1)注解(Anno...
    99+
    2023-07-02
  • SpringBoot常用注解实例分析
    这篇文章主要介绍“SpringBoot常用注解实例分析”,在日常操作中,相信很多人在SpringBoot常用注解实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot常用注解实例分析”的疑...
    99+
    2023-06-30
  • Spring定时任务中@PostConstruct被多次执行异常的示例分析
    这篇文章主要介绍Spring定时任务中@PostConstruct被多次执行异常的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!发现问题最近在项目中刚刚修改一个功能,代码正准备验证,启动Idea的debug模...
    99+
    2023-05-30
    spring @postconstruct
  • Spring注解之@Import注解的使用和源码分析
    目录介绍@Import导入bean的三种方式普通类ImportSelector接口ImportBeanDefinitionRegistrar接口源码解析总结介绍 今天主要介...
    99+
    2023-05-16
    Spring注解@Import Spring注解 @Import注解的使用 注解@Import源码
  • Spring Ioc和DI注解实例分析
    今天小编给大家分享一下Spring Ioc和DI注解实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.Sp...
    99+
    2023-06-29
  • Java注解和异常实例分析
    今天小编给大家分享一下Java注解和异常实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。注解作用注解是JDK1.5版本...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作