<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          @PostConstruct注解知道嗎?

          共 6237字,需瀏覽 13分鐘

           ·

          2021-03-14 18:20

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

          @PostConstruct基本:

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


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


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


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


          應(yīng)用:在靜態(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)的呢?

          需要先學(xué)習下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);    



          ————————————————

          版權(quán)聲明:本文為CSDN博主「那些很冒險的夢丶」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

          原文鏈接:

          https://blog.csdn.net/qq360694660/article/details/82877222






          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長按上方微信二維碼 2 秒





          感謝點贊支持下哈 

          瀏覽 60
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区AV | 男女啪啪免费网站 | 男女激情在线观看 | 欧美一级毛片免费高清老鸭窝 | 午夜福利人人妻人人澡人人爽 |