1. 程式人生 > 其它 >vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short

vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short

技術標籤:Spring/SpringBoot

3.1 Spring Bean中初始方法和銷燬方法的執行順序

  1. 構造方法
  2. Aware 介面方法,見AbstractAutowireCapableBeanFactory.initializeBean()和ApplicationContextAwareProcessor
  3. @PostConstruct 註解的方法
  4. InitializingBean 介面方法
  5. @Bean(initMethod=”customInitMethod”)
  6. SmartInitializingSingleton 介面方法
  7. @PreDestroy 註解方法
  8. DisposableBean 介面方法
  9. @Bean(destroyMethod=”customDestroyMethod”)

3.2 BeanPostProcessor後置處理器

  • org.springframework.beans.factory.config.BeanPostProcessor
    postProcessBeforeInitialization(Object bean, String beanName)在初始化之前被回撥,即在InitializingBean介面方法被執行之前被呼叫,但是不能保證在
    @PostConstruct和Aware方法被執行之前被呼叫.
  • postProcessAfterInitialization(Object bean, String beanName)

    在初始化之後執行,包括@Bean()中initMethod屬性指定的方法.但是未執行SmartInitializingSingleton介面方法
    在這裡插入圖片描述
    在這裡插入圖片描述

3.3 DestructionAwareBeanPostProces後置處理器

org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor為BeanPostProcessor子類.
void postProcessBeforeDestruction在Bean物件被銷燬之前回調.
boolean requiresDestruction(Object bean) 判斷物件是否在銷燬之前回調

介面卡模式:
org.springframework.beans.factory.support.DisposableBeanAdapter
在這裡插入圖片描述

3.4 InstantiationAwareBeanPostProcessor後置處理器

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor為BeanPostProcessor子類,但其自定義介面,由先於父類介面執行.
在這裡插入圖片描述
postProcessBeforeInstantiation(Class<?> beanClass, String beanName)在物件被建立之前被執行. 例如Spring的AOP中的代理類就是在這個方法實現, org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
postProcessAfterInstantiation(Object bean, String beanName)在物件被建立後回撥,但是在MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition方法被呼叫之後, BeanPostProcessor.postProcessBeforeInitialization方法被呼叫之前.該方法的返回值應該設定為true, 緊接著會呼叫postProcessProperties() 見方法AbstractAutowireCapableBeanFactory.populateBean, 如果多個實現類,只要有一個返回false,那麼全部實現類不會呼叫postProcessProperties(),所以這個方法spring預設為true
PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)給物件屬性賦值,不能返回null值,
@Value 和 @Autowired 註解就是通過該回調介面完成,見AutowiredAnnotationBeanPostProcessor

3.5 MergedBeanDefinitionPostProcessor 後置處理器

org.springframework.beans.factory.support.MergedBeanDefinitionPostProc當其他型別的BeanDefinition 被合併為RootBeanDefinition時回撥,但是此時Bean物件其實已經建立. org.springframework.context.support.ApplicationListenerDetector通過此介面記錄bean是否為單例,
在這裡插入圖片描述

3.6 SmartInstantiationAwareBeanPostProcessor 後置處理器

SmartInstantiationAwareBeanPostProcessor是InstantiationAwareBeanPostProcessor的子介面.
在這裡插入圖片描述
Class<?> predictBeanType(Class<?> beanClass, String beanName)用於型別推斷,例如可能通過動態代理建立beanClass的子類,並使其實現監聽器介面,當通過applicationContext.getBeansOfType(ApplicationListener.class)獲取bean時也會得到該代理類的例項
Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)返回當前類例項化採用哪個建構函式
getEarlyBeanReference(Object bean, String beanName)獲取一個bean的引用,但是這個bean可能還沒有初始化,一般用於解決迴圈引用問題. AbstractAutoProxyCreator 237行有其實現.

3.7 帶著問題看原始碼

1 @PostConstruct 什麼時候執行?

CommonAnnotationBeanPostProcessor 繼承InitDestroyAnnotationBeanPostProcessor 在postProcessBeforeInitialization中查詢@ PostConstruct註解方法執行

2 InitializingBean 什麼時候執行? init-method 什麼時候執行?

AbstractAutowireCapableBeanFactory. initializeBean()方法中呼叫
invokeInitMethods(beanName, wrappedBean, mbd)方法

3 SmartInitializingSingleton 什麼時候執行?

在AbstractApplicationContext中呼叫preInstantiateSingletons(), 通過getBean()完成所有bean例項化之後, 然後遍歷所有的Bean,回撥SmartInitializingSingleton介面方法,這個介面的好處是,不會提前觸發bean的建立.在titans-cache中需要收集快取註解設定,便是通過這個回撥介面完成.

4 @Import註解的使用

該註解用於向Spring容器中匯入我們的配置類,支援ImportSelector介面實現類和ImportBeanDefinitionRegistrar介面實現類的匯入,同時支援普通Bean的匯入。當Spring會將每一個掃描到的類做為配置類,封裝在ConfigurationClass中,並對其進行解析,如果發現類上標有@Import註解,則會呼叫該註解載入匯入的類,採用遞迴的方式,對匯入的進行解析,直到匯入的是一個普通類。被匯入的類同時會被註冊為Spring容器中的Bean。原始碼見:org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) 302行。
titans框架中很多元件的啟動是通過該方式實現,例如:@EnableWeb , @EnableDubbo, @EnableMultiCache等註解的實現

5 Spring應用退出close()方法在哪執行?

AbstractApplicationContext. registerShutdownHook
Runtime.getRuntime().addShutdownHook(this.shutdownHook);

6 原始碼分析SpringBean的生命週期

AbstractBeanFactory.getBean() 斷點
AbstractBeanFactory  199
AbstractBeanFactory  242
AbstractBeanFactory  246
DefaultSingletonBeanRegistry 177
AbstractBeanFactory  294
AbstractBeanFactory  318
AbstractAutowireCapableBeanFactory 515
AbstractAutowireCapableBeanFactory 550
AbstractAutowireCapableBeanFactory 557
AbstractAutowireCapableBeanFactory 567
AbstractAutowireCapableBeanFactory 586
AbstractAutowireCapableBeanFactory 592
AbstractBeanFactory 1217