@PostConstruct注解

@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。通常我们会是在Spring…

大家好,又见面了,我是你们的朋友全栈君。

@PostConstruct基本:

@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。

Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:

Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

应用:在静态方法中调用依赖注入的Bean中的方法。

package com.example.studySpringBoot.util;

import com.example.studySpringBoot.service.MyMethorClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class MyUtils {

    private static MyUtils          staticInstance = new MyUtils();

    @Autowired
    private MyMethorClassService    myService;

    @PostConstruct
    public void init(){
        staticInstance.myService = myService;
    }

    public static Integer invokeBean(){
        return staticInstance.myService.add(10,20);
    }
}

那么Java提供的@PostConstruct注解,Spring是如何实现的呢?

需要先学习下BeanPostProcessor这个接口:

public interface BeanPostProcessor {

	/**
     * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean
	 * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
	 * or a custom init-method). The bean will already be populated with property values.
	 * The returned bean instance may be a wrapper around the original.
     * 
     * 任何Bean实例化,并且Bean已经populated(填充属性) 就会回调这个方法
     *
     */
	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

	/**
	 * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean
	 * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
	 * or a custom init-method). The bean will already be populated with property values.
	 * The returned bean instance may be a wrapper around the original.
     *
     * 任何Bean实例化,并且Bean已经populated(填充属性) 就会回调这个方法
     *
     */
	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
那Spring初始化是那里回调这些方法呢?
AbstractApplicationContext.finishBeanFactoryInitialization(...);
    beanFactory.preInstantiateSingletons();
       DefaultListableBeanFactory.getBean(beanName);
          AbstractBeanFactory.doGetBean();
            AbstractAutowireCapableBeanFactory.createBean(....)
                populateBean(beanName, mbd, instanceWrapper);
                initializeBean(...)
                 //调用BeanPostProcessor.postProcessBeforeInitialization()方法
                  applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                 //调用BeanPostProcessor.postProcessBeforeInitialization()方法
                  applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

 

BeanPostProcessor有个实现类CommonAnnotationBeanPostProcessor,就是专门处理@PostConstruct  @PreDestroy注解。

CommonAnnotationBeanPostProcessor的父类InitDestroyAnnotationBeanPostProcessor()
 InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization()
    InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata()
        // 组装生命周期元数据
        InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata()
            // 查找@PostConstruct注释的方法
            InitDestroyAnnotationBeanPostProcessor.initAnnotationType
            // 查找@PreDestroy注释方法
            InitDestroyAnnotationBeanPostProcessor.destroyAnnotationType
 // 反射调用          
 metadata.invokeInitMethods(bean, beanName);    

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125252.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月5日 上午8:00
下一篇 2022年4月5日 上午8:35


相关推荐

  • 大学课程 | 《微机原理与接口技术》知识点总结[通俗易懂]

    大学课程 | 《微机原理与接口技术》知识点总结[通俗易懂]文章目录第一章微型计算机基础概论第一讲关于第二讲微型计算机系统组成第三讲微机工作过程第四讲常用数制第五讲编码第六讲数及其运算第七讲基本逻辑运算和逻辑门第八讲基本逻辑运算及其门电路第二章微处理器与总线第九讲8088/8086微处理器第十讲8088的主要引线及其内部结构第十一讲8088CPU内部寄存器第十二讲实模式下的存储器寻址第十三讲8088系统总线第三章指令系统概述第十四讲8088/8086指令系统第十五讲指令的寻址方式第十六讲数据传送指令第四章算术运算,逻辑运算与

    2022年10月3日
    6
  • javascript UniqueID属性

    javascript UniqueID属性nbsp nbsp nbsp 在 Web 页中的每个 HTML 元素都一个 ID 属性 ID 作为其标示 在我们的普通理解中它应该是 unique 的 可是 HTML 元素的 ID 属性是可写的 这就造成了我们很可能人为的使 ID 的重复 按么如果 ID 重复了怎么办呢 我们又怎么来给 HTML 元素弄一个唯一的标示呢 nbsp nbsp nbsp 由于 IE 对格式混乱 不完整的或有错嵌套关系 的 HTML 代码由极好的容错性 对于 HTML 元素的 ID 重复问题对它来说简直就是小菜一碟

    2026年3月16日
    2
  • github 收藏_安全小案例分享

    github 收藏_安全小案例分享小案例GitHub地址收藏说明:平时用到的小案例会收藏到此处点击标题直接进入原创者位置并会标明作者js轮播图支持移动端制作人:hishionH5页面唤起APP/移动端网页打开APP作者:ihziluoh…

    2022年4月19日
    53
  • Jackson 动态过滤属性,编程式过滤对象中的属性

    Jackson 动态过滤属性,编程式过滤对象中的属性

    2022年3月2日
    37
  • ODPS 下一个map / reduce 准备

    ODPS 下一个map / reduce 准备

    2022年1月2日
    40
  • 利用STM32F103精确控制步进电机

    利用STM32F103精确控制步进电机**利用STM32F103控制步进电机精确角度转动**欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,…

    2022年6月1日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号