<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注解會(huì)用指南

          共 4426字,需瀏覽 9分鐘

           ·

          2021-06-11 00:55

          點(diǎn)擊上方 Java學(xué)習(xí)之道,選擇 設(shè)為星標(biāo)

          每天18:30點(diǎn),干貨準(zhǔn)時(shí)奉上!

          來源: blog.csdn.net/qq360694660/article/details/82877222
          作者: 那些很冒險(xiǎn)的夢(mèng)丶

          Part1@PostConstruct基本

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

          Java中該注解的說明

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

          通常我們會(huì)是在Spring框架中使用到@PostConstruct注解

          該注解的方法在整個(gè)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是如何實(shí)現(xiàn)的呢?需要先學(xué)習(xí)下BeanPostProcessor這個(gè)接口

          Part2BeanPostProcessor接口

          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實(shí)例化,并且Bean已經(jīng)populated(填充屬性) 就會(huì)回調(diào)這個(gè)方法
           *
           */

          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實(shí)例化,并且Bean已經(jīng)populated(填充屬性) 就會(huì)回調(diào)這個(gè)方法
           *
           */

          Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

          Part3Spring初始化是那里回調(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有個(gè)實(shí)現(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);
          -- END --

           | 更多精彩文章 -




          加我微信,交個(gè)朋友
          長(zhǎng)按/掃碼添加↑↑↑

          瀏覽 134
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  青春草在线免费视频 | 亚洲喷水 | 欧美日韩在线免费观看 | 中文字幕无码日韩专区免费 | 西西特级444www高清视频 |