欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的@PostConstruct注解

 更新時間:2025年04月09日 09:27:37   作者:那些很冒險的夢丶  
本文給大家介紹Java中的@PostConstruct注解的相關(guān)知識,通過示例代碼給大家補充介紹了Java提供的@PostConstruct注解,Spring是如何實現(xiàn)的,感興趣的朋友一起看看吧

@PostConstruct基本:

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

Java中該注解的說明:@PostConstruct該注解被用來修飾一個非靜態(tài)的void()方法。被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且只會被服務器執(zhí)行一次。PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行。

通常我們會是在Spring框架中使用到@PostConstruct注解 該注解的方法在整個Bean初始化中的執(zhí)行順序:

Constructor(構(gòu)造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)

應用:在靜態(tài)方法中調(diào)用依賴注入的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是如何實現(xiàn)的呢?

需要先學習下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已經(jīng)populated(填充屬性) 就會回調(diào)這個方法
     *
     */
	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已經(jīng)populated(填充屬性) 就會回調(diào)這個方法
     *
     */
	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

那Spring初始化是那里回調(diào)這些方法呢?

AbstractApplicationContext.finishBeanFactoryInitialization(...);
    beanFactory.preInstantiateSingletons();
       DefaultListableBeanFactory.getBean(beanName);
          AbstractBeanFactory.doGetBean();
            AbstractAutowireCapableBeanFactory.createBean(....)
                populateBean(beanName, mbd, instanceWrapper);
                initializeBean(...)
                 //調(diào)用BeanPostProcessor.postProcessBeforeInitialization()方法
                  applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                 //調(diào)用BeanPostProcessor.postProcessBeforeInitialization()方法
                  applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

BeanPostProcessor有個實現(xiàn)類CommonAnnotationBeanPostProcessor,就是專門處理@PostConstruct  @PreDestroy注解。

CommonAnnotationBeanPostProcessor的父類InitDestroyAnnotationBeanPostProcessor()
 InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization()
    InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata()
        // 組裝生命周期元數(shù)據(jù)
        InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata()
            // 查找@PostConstruct注釋的方法
            InitDestroyAnnotationBeanPostProcessor.initAnnotationType
            // 查找@PreDestroy注釋方法
            InitDestroyAnnotationBeanPostProcessor.destroyAnnotationType
 // 反射調(diào)用          
 metadata.invokeInitMethods(bean, beanName);    

到此這篇關(guān)于Java中的@PostConstruct注解的文章就介紹到這了,更多相關(guān)Java @PostConstruct注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論