精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何讓 Bean 深度感知 Spring 容器

開發 前端
雖然 Spring 中的 Bean 可以不用去感知 Spring 容器的存在,但是在實際開發中,我們往往還是需要 Spring 容器提供的各種能力,這樣就迫使我們的 Bean 不得不去感知到 Spring 容器的存在。

Spring 有一個特點,就是創建出來的 Bean 對容器是無感的,一個 Bean 是怎么樣被容器從一個 Class 整成一個 Bean 的,對于 Bean 本身來說是不知道的,當然也不需要知道,也就是 Bean 對容器的存在是無感的。

但是有時候我們可能會遇到一些場景,這些場景讓我們去感知容器的存在,松哥舉幾個例子:

  1. Spring 容器提供的功能不止 IoC、AOP 這些,常見的 I18N 也是 Spring 的能力之一,如果我們想要在自己的 Bean 中去使用 I18N,那就得去找 Spring,這樣就感知到了 Spring 容器的存在了。
  2. Spring 提供了資源加載器,如果我們想要使用這個資源加載器去加載配置,那就得去找 Spring 要,這樣就感知到了 Spring 容器的存在了。
  3. 想根據 beanName 去 Spring 容器中查找 Bean,那不用多說,肯定得知道 Spring 容器的存在。
  4. ...

也就是說,雖然 Spring 中的 Bean 可以不用去感知 Spring 容器的存在,但是在實際開發中,我們往往還是需要 Spring 容器提供的各種能力,這樣就迫使我們的 Bean 不得不去感知到 Spring 容器的存在。

那么 Spring 中的 Bean 如何感知到 Spring 容器的存在呢?

1. Aware

Aware 本身就有感知的意思。

Spring Aware 是 Spring 框架中的一個特性,它允許我們的應用程序或組件與 Spring 容器進行交互。當一個類實現了 Spring Aware 接口并注冊到 Spring 容器中時,該類就能夠感知到 Spring 容器的存在,并且可以獲取容器的一些資源或進行一些特定的操作。

Spring Aware 接口包括了多個子接口,每個子接口對應于不同的 Spring 容器資源或功能。

Aware 的實現有很多,大的方向來說主要有如下一些:

圖片圖片

每一個 Aware 的作用如下:

  • ApplicationEventPublisherAware:實現該接口的對象可以獲取事件發布的能力。
  • ServletContextAware:實現該接口的對象可以獲取到 ServletContext 對象。
  • MessageSourceAware:實現該接口的對象可以獲取到 MessageSource 對象,MessageSource 支持多消息源,主要用于主要用于國際化。
  • ResourceLoaderAware:實現該接口的對象可以獲取到一個 ResourceLoader,Spring ResourceLoader 則為我們提供了一個統一的 getResource() 方法來通過資源路徑檢索外部資源,例如文本文件、XML 文件、屬性文件或圖像文件等。
  • ApplicationStartupAware:實現該接口的對象可以獲取到一個 ApplicationStartup 對象,這個比較新,是 Spring 5.3 中新推出的,通過 ApplicationStartup 可以標記應用程序啟動期間的步驟,并收集有關執行上下文或其處理時間的數據。
  • NotificationPublisherAware:實現該接的對象可以獲取到一個 NotificationPublisher 對象,通過該對象可以實現通知的發送。
  • EnvironmentAware:實現該接口的對象可以獲取到一個 Environment 對象,通過 Environment 可以獲取到容器的環境信息。
  • BeanFactoryAware:實現該接口的對象可以獲取到一個 BeanFactory 對象,通過 BeanFactory 可以完成 Bean 的查詢等操作。
  • ImportAware:實現該接口的對象可以獲取到一個 AnnotationMetadata 對象,ImportAware 接口是需要和 @Import 注解一起使用的。在 @Import 作為元注解使用時,通過 @Import 導入的配置類如果實現了 ImportAware 接口就可以獲取到導入該配置類接口的數據配置。
  • EmbeddedValueResolverAware:實現該接口的對象可以獲取到一個 StringValueResolver 對象,通過 StringValueResolver 對象,可以讀取到 Spring 容器中的 properties 配置的值(YAML 配置也可以)。
  • ServletConfigAware:實現該接口的對象可以獲取到一個 ServletConfig 對象,不過這個似乎沒什么用,我們很少自己去配置 ServletConfig。
  • LoadTimeWeaverAware:實現該接口的對象可以獲取到一個 LoadTimeWeaver 對象,通過該對象可以獲取加載 Spring Bean 時織入的第三方模塊,如 AspectJ 等。
  • BeanClassLoaderAware:實現該接口的對象可以獲取到一個 ClassLoader 對象,ClassLoader 能干嘛不需要我多說了吧。
  • BeanNameAware:實現該接口的對象可以獲取到一個當前 Bean 的名稱。
  • ApplicationContextAware:實現該接口的對象可以獲取到一個 ApplicationContext 對象,通過 ApplicationContext 可以獲取容器中的 Bean、環境等信息。

通過實現這些接口,我們可以在應用程序中獲取 Spring 容器提供的各種資源,并與容器進行交互,以實現更靈活和可擴展的功能。

2. 實踐

舉兩個例子小伙伴們來感受下 Aware 的具體用法。

2.1 案例

例如我想在 Bean 中感知到當前 Bean 的名字,那么我們可以按照如下方式來使用:

@Service
public class UserService implements BeanNameAware {
    private String beanName;
    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }

    @Override
    public String toString() {
        return "UserService{" +
                "beanName='" + beanName + '\'' +
                '}';
    }
}

讓當前 bean 實現 BeanNameAware 接口,并重寫 setBeanName 方法,這個方法會在 Spring 容器初始化 Bean 的時候自動被調用,我們就可以據此獲取到 bean 的名稱了。

再比如我想做一個工具 Bean,用來查找其他 Bean,那么我可以使用如下方式:

@Component
public class BeanUtils implements BeanFactoryAware {
    private static BeanFactory beanFactory;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public static  <T> T getBean(Class<T> clazz) {
        return (T) beanFactory.getBean(clazz);
    }
}

讓當前 Bean 實現 BeanFactoryAware 接口并重寫 setBeanFactory 方法,在系統初始化當前 Bean 的時候,會自動調用 setBeanFactory 方法,進而將 beanFactory 變量傳進來。

2.2 原理

當 Spring 容器創建一個 Bean 的時候,大致的流程是創建實例對象 -> 屬性填充 -> Bean 初始化。

最后這個 Bean 的初始化,就是調用 init 方法、afterPropertiesSet 方法以及 BeanPostProcessor 中的方法的,如下:

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
 invokeAwareMethods(beanName, bean);
 Object wrappedBean = bean;
 if (mbd == null || !mbd.isSynthetic()) {
  wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 }
 try {
  invokeInitMethods(beanName, wrappedBean, mbd);
 }
 catch (Throwable ex) {
  throw new BeanCreationException(
    (mbd != null ? mbd.getResourceDescription() : null), beanName, ex.getMessage(), ex);
 }
 if (mbd == null || !mbd.isSynthetic()) {
  wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 }
 return wrappedBean;
}

在這個方法一進來,首先有一個 invokeAwareMethods,這個就是用來觸發 Aware 的,來看下:

private void invokeAwareMethods(String beanName, Object bean) {
 if (bean instanceof Aware) {
  if (bean instanceof BeanNameAware beanNameAware) {
   beanNameAware.setBeanName(beanName);
  }
  if (bean instanceof BeanClassLoaderAware beanClassLoaderAware) {
   ClassLoader bcl = getBeanClassLoader();
   if (bcl != null) {
    beanClassLoaderAware.setBeanClassLoader(bcl);
   }
  }
  if (bean instanceof BeanFactoryAware beanFactoryAware) {
   beanFactoryAware.setBeanFactory(AbstractAutowireCapableBeanFactory.this);
  }
 }
}

小伙伴們可以看到,BeanNameAware、BeanClassLoaderAware 以及 BeanFactoryAware 這三種類型的 Aware 是在這里觸發的。

每種 Aware 因為功能不同,因此作用的時機也不同。

invokeAwareMethods 方法執行完畢之后,接下來是執行 applyBeanPostProcessorsBeforeInitialization 方法,這個我們之前分析過,這個方法最終會觸發 BeanPostProcessor#postProcessBeforeInitialization 方法的執行,而 BeanPostProcessor 有一個子類專門處理 Aware 的,就是 ApplicationContextAwareProcessor:

@Override
@Nullable
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
   bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
   bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ||
   bean instanceof ApplicationStartupAware)) {
  return bean;
 }
 invokeAwareInterfaces(bean);
 return bean;
}
private void invokeAwareInterfaces(Object bean) {
 if (bean instanceof Aware) {
  if (bean instanceof EnvironmentAware environmentAware) {
   environmentAware.setEnvironment(this.applicationContext.getEnvironment());
  }
  if (bean instanceof EmbeddedValueResolverAware embeddedValueResolverAware) {
   embeddedValueResolverAware.setEmbeddedValueResolver(this.embeddedValueResolver);
  }
  if (bean instanceof ResourceLoaderAware resourceLoaderAware) {
   resourceLoaderAware.setResourceLoader(this.applicationContext);
  }
  if (bean instanceof ApplicationEventPublisherAware applicationEventPublisherAware) {
   applicationEventPublisherAware.setApplicationEventPublisher(this.applicationContext);
  }
  if (bean instanceof MessageSourceAware messageSourceAware) {
   messageSourceAware.setMessageSource(this.applicationContext);
  }
  if (bean instanceof ApplicationStartupAware applicationStartupAware) {
   applicationStartupAware.setApplicationStartup(this.applicationContext.getApplicationStartup());
  }
  if (bean instanceof ApplicationContextAware applicationContextAware) {
   applicationContextAware.setApplicationContext(this.applicationContext);
  }
 }
}

大家看下,這七種類型的 Aware 是在這里被觸發的。

另外像 ImportAware 是在 ImportAwareBeanPostProcessor#postProcessBeforeInitialization 方法中處理的;LoadTimeWeaverAware 是在 、LoadTimeWeaverAwareProcessor#postProcessBeforeInitialization 方法中處理的。

基本上,大部分的 Aware 接口都是在 BeanPostProcessor 中處理的。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2022-06-23 10:47:57

Spring容器工具

2023-01-13 07:41:20

BeanSpring容器

2009-06-19 11:18:51

Factory BeaSpring配置

2021-03-08 08:40:25

Spring Bean 創建單例對象

2022-12-27 08:12:27

IOC容器Bean

2015-12-03 14:33:35

2020-10-14 10:25:20

深度學習機器學習神經網絡

2017-04-14 08:58:55

深度學習感知機深度網絡

2024-05-29 08:19:03

2020-12-11 08:04:22

SpringAOPBean

2009-06-18 11:15:53

裝配beanxml配置Spring

2010-09-15 11:20:09

2023-09-12 16:20:04

邊緣AI深度學習

2024-05-28 07:55:31

SpringBean用域

2016-10-17 17:57:51

無線手勢感知無線WiFinger

2022-05-27 08:25:55

容器Spring

2023-07-26 00:43:31

2021-07-15 09:47:20

Docker容器命令

2020-06-16 13:22:22

AI創新深度學習

2021-05-11 07:42:59

BeanSpring屬性
點贊
收藏

51CTO技術棧公眾號

thepron国产精品| 麻豆精品国产| 91麻豆精东视频| 97国产一区二区精品久久呦| 中文字幕一区二区人妻电影丶| 国产v日韩v欧美v| 99re66热这里只有精品3直播| 97在线看福利| 成年人免费观看视频网站| 蜜臀av国内免费精品久久久夜夜| 国产成a人亚洲| 97视频在线观看视频免费视频 | 欧洲亚洲精品视频| 久久精品国产清高在天天线| 中日韩美女免费视频网址在线观看| 久久这里只精品| 日韩成年人视频| 免费黄网站在线| 国产精品一区久久久久| 国内精品400部情侣激情| 亚洲色图14p| 国产精品伊人| 亚洲人成小说网站色在线| 国产伦理久久久| 国产九色91回来了| 国产精品a久久久久| 亚洲精品自拍第一页| 狠狠干狠狠操视频| 超碰资源在线| 亚洲男人天堂av| 精品亚洲欧美日韩| 99久久精品国产一区色 | 日本一区二区三区四区高清视频| 中日韩在线观看视频| 国内久久视频| 国产精品分类| 欧美精品一区二区在线观看| 在线免费观看视频黄| h片在线观看| 国产欧美日产一区| 国产麻豆日韩| 国产日韩欧美一区二区东京热| 中文精品视频| 欧美精品少妇videofree| 欧美人妻一区二区三区| 精品久久97| 欧美一级片在线看| 亚洲精品视频导航| 亚洲日本天堂| 一区二区高清视频在线观看| 亚洲高清123| 水中色av综合| 成人一区二区三区| 国产噜噜噜噜噜久久久久久久久| 亚洲精品77777| 欧美特黄视频| 久久91精品国产| 国产性色av一区二区| 亚洲熟妇av乱码在线观看| 伊人久久av| 亚洲黄色在线视频| 午夜精品一区二区在线观看 | 无码精品人妻一区二区| 国产裸体歌舞团一区二区| 国产成人一区二区在线| 日本少妇bbwbbw精品| 亚洲盗摄视频| 日韩成人av一区| 在线天堂www在线国语对白| 亚洲一区 二区| 91精品国产综合久久久蜜臀粉嫩 | 欧美中文在线| 99视频精品全部免费在线| 国产精品一区二区不卡视频| 亚洲美女性生活| 成人美女在线视频| 成人av色在线观看| 国产又粗又猛又爽又黄的| 美日韩一级片在线观看| 国产精品久久久久久久久久久新郎 | www999久久| 欧美日韩一卡二卡| 日韩av自拍偷拍| 久久69成人| 在线不卡的av| 自拍一级黄色片| 精品国产亚洲一区二区三区| 欧美一级搡bbbb搡bbbb| 激情av中文字幕| 欧洲在线一区| 国产一区二区三区视频| 18啪啪污污免费网站| 四季av一区二区凹凸精品| 精品久久久av| 欧美日韩一级在线观看| 一区视频在线| 欧美一区二区三区精品电影| 国产精品第5页| 麻豆成人久久精品二区三区红| 成人在线中文字幕| 国产视频在线观看免费| 风流少妇一区二区| 麻豆亚洲一区| 亚洲免费视频一区二区三区| 国产自产女人91一区在线观看| 成人午夜淫片100集| 视频在线在亚洲| 日韩av手机在线看| 91精东传媒理伦片在线观看| 国产精品1区二区.| 精品毛片久久久久久| 国产黄色片在线播放| 国产亚洲一区二区三区四区 | 免费黄色日本网站| 成人全视频免费观看在线看| 日韩一区二区电影| 91精品人妻一区二区| 国产成人3p视频免费观看| 在线性视频日韩欧美| 欧美精品制服第一页| 一起操在线视频| 国产精品18hdxxxⅹ在线| 亚洲丝袜一区在线| 免费在线观看av网址| 久久国产一二区| 亚洲自拍小视频| 黄色av免费在线观看| 国产精品色婷婷| 国产一级爱c视频| 999精品视频在线观看| 91麻豆精品国产91久久久| 成人免费毛片糖心| 亚洲欧美一级二级三级| 国产91ⅴ在线精品免费观看| 国产精品九九九九| www久久精品| 欧美a级免费视频| 人人精品久久| 亚洲欧美国内爽妇网| 青青草激情视频| 久久精品国产**网站演员| 狼狼综合久久久久综合网| 在线播放蜜桃麻豆| 欧美日韩成人一区| 亚洲AV无码成人精品区明星换面 | 色播视频在线播放| 国产福利精品一区二区| 亚洲欧美影院| 欧美色片在线观看| 亚洲精选一区二区| 日本亚洲欧美在线| 国产成人亚洲综合a∨婷婷 | 欧美在线视频一区| 99久久免费国产精精品| 国产欧美一区二区三区网站| 久久成人免费观看| 色视频免费在线观看| 日韩欧美在线精品| 欧美成人黄色小视频| 91亚洲精品国偷拍自产在线观看| 久久午夜电影网| 欧美变态另类刺激| 久久影院资源站| 欧美精品久久久久a| 国产ts人妖调教重口男| 国产日韩精品视频一区| 欧美一级片中文字幕| 天堂一区二区三区四区| 91av国产在线| 偷拍自拍在线| 色婷婷亚洲精品| 国产又粗又猛又爽又黄av| 久久国产88| 国产精品日本一区二区| 丁香花视频在线观看| 亚洲高清免费观看高清完整版| 国产在线观看你懂的| 成人黄色国产精品网站大全在线免费观看| 日韩极品视频在线观看 | 91在线观看欧美日韩| 国产婷婷视频在线| 制服丝袜亚洲播放| 久久国产精品国语对白| 国产精品一区久久久久| www.亚洲视频.com| 日本一区影院| 欧美精品激情在线| 欧美一区二区少妇| 在线免费观看日本欧美| 国产精品夜夜夜爽阿娇| 国产精品123| 黄色国产一级视频| 国产一区二区三区网| 国产日韩欧美视频在线| a级影片在线观看| 欧美mv和日韩mv国产网站| 国产在线视频99| 久久影院午夜片一区| 欧美日韩在线观看不卡| 亚洲精品国产成人影院| 亚洲综合第一页| 国产99re66在线视频| 精品亚洲男同gayvideo网站 | 国产乱子伦三级在线播放| 欧美日韩精品一区二区在线播放 | 亚欧色一区w666天堂| 国产人妻人伦精品1国产丝袜| 久久亚洲综合| 91免费视频黄| 亚洲综合20p| 国产精品入口| 中文字幕色呦呦| 欧美精品久久久久久| 国产一区二区不卡视频在线观看| 久久91导航| 91av视频在线观看| 18+视频在线观看| 最近的2019中文字幕免费一页| 天天爽夜夜爽夜夜爽| 日韩欧美www| 国产精品毛片一区视频播| 色先锋资源久久综合| 国产亚洲小视频| 亚洲欧美日韩在线| 国产又粗又长又黄的视频| 国产亚洲一区字幕| 免费观看一级一片| 成人福利视频网站| 国产69视频在线观看| 国产精品影音先锋| 中文字幕在线视频精品| 麻豆精品国产传媒mv男同| 成年人网站大全| 蜜桃av综合| 国产精品无码专区av在线播放| 亚洲精品影视| r级无码视频在线观看| 欧美黄色免费| 国产精品av免费观看| 中文字幕一区二区精品区| 自拍偷拍一区二区三区| 欧美伦理在线视频| 性欧美精品一区二区三区在线播放| 欧美日韩播放| 日本精品免费| 国产一区不卡| 日韩.欧美.亚洲| 凹凸成人精品亚洲精品密奴| 日韩视频在线观看国产| 干日本少妇视频| 精品少妇爆乳无码av无码专区| 欧美激情一区二区三区四区| 大又大又粗又硬又爽少妇毛片| 国产不卡免费视频| 91在线精品观看| 日韩成人高清| 国产欧美日韩精品专区| 黄色成人在线观看网站| 国产精品最新在线观看| 亚洲资源在线| 波多野结衣成人在线| 国产精品对白久久久久粗| 国产成人在线视频网址| 国产在线视频在线| 在线观看亚洲| 男人揉女人奶房视频60分 | 2020国产精品小视频| 91精品久久久久久久久青青 | 国产理论在线| 7777精品久久久久久| 经典三级一区二区| 国产欧美精品一区二区三区介绍| **精品中文字幕一区二区三区| 99九九电视剧免费观看| 日韩在线麻豆| 亚洲一区在线免费| 欧美特黄a级高清免费大片a级| 欧美色图色综合| 久久国产生活片100| 亚洲精品无码一区二区| 久久久久高清精品| 国产性生活大片| 五月激情综合色| 中文字幕视频一区二区| 日韩欧美高清在线| 日本一区视频| 欧美成在线观看| 成人欧美大片| 91久久精品www人人做人人爽| 日韩欧美ww| 午夜探花在线观看| 国产欧美日韩一区二区三区在线| 在线观看免费污视频| 波多野结衣在线一区| 中文字幕第69页| 五月婷婷久久丁香| 亚洲自拍偷拍另类| 亚洲激情免费观看| 男人天堂久久久| 欧美亚洲在线播放| 欧美片网站免费| 日韩欧美一区二区三区四区五区 | 国产欧美日韩精品一区二区免费| 激情五月五月婷婷| 日韩精品五月天| 美女搡bbb又爽又猛又黄www| 中文欧美字幕免费| 成人午夜视频精品一区| 91精品国产综合久久精品| 四虎成人免费在线| 久久久久久久久中文字幕| 国产欧美自拍| 欧美日韩大片一区二区三区 | 性欧美办公室18xxxxhd| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 欧美精品久久一区| 六十路在线观看| 久久久久久久久久久免费精品| 久久天天久久| 欧美午夜欧美| 在线亚洲激情| 国产精品入口麻豆| 亚洲柠檬福利资源导航| 亚洲中文字幕一区二区| 亚洲欧洲日韩国产| 成人三级高清视频在线看| 96pao国产成视频永久免费| 不卡在线一区二区| 成人一区二区三| 91麻豆文化传媒在线观看| 国产精彩视频在线观看| 欧美一区二区视频在线观看2022| 在线观看av的网站| 国产精品18久久久久久首页狼| 亚洲欧美tv| 欧美成人xxxxx| 91看片淫黄大片一级在线观看| 日韩激情一区二区三区| 精品av久久707| 91福利区在线观看| 国产精品亚洲综合| 国产综合色产| www,av在线| 1000部国产精品成人观看| 亚洲一区在线观| 色偷偷88888欧美精品久久久 | 日韩视频一区二区三区在线播放 | 依依成人精品视频| 99国产在线播放| 蜜臀久久99精品久久久久久宅男 | 日韩精品第二页| 亚洲一一在线| 国产在线一区观看| 9999热视频| 日韩精品中文字幕在线不卡尤物| 中日韩高清电影网| 国产精品久久国产三级国电话系列 | 亚洲三级av在线| 国产精品久久久久77777丨| 先锋影音网一区| 九九**精品视频免费播放| 亚洲综合网在线| 亚洲大胆人体视频| 中文字幕色婷婷在线视频| 日韩久久久久久久| 另类调教123区| 欧美三级小视频| 亚洲精品第一页| 免费在线观看一区| 日本福利视频导航| 岛国av在线一区| 丁香社区五月天| 久久久精品电影| 加勒比视频一区| 成人免费视频久久| 亚洲美女视频在线观看| 欧美一区二区三区黄片| 国产xxx69麻豆国语对白| 99精品全国免费观看视频软件| 日本泡妞xxxx免费视频软件| 好吊成人免视频| 91高清在线视频| 99国产在线视频| 久久av在线| 东方av正在进入| 亚洲人成网站色ww在线| va天堂va亚洲va影视| 毛片在线播放视频| 国产精品视频一区二区三区不卡| 亚洲AV午夜精品| 国产精品69久久| 国产精品大片| 人妻一区二区视频| 精品国产一区二区亚洲人成毛片| **欧美日韩在线观看| 日本福利视频网站| 国产欧美日韩另类一区| 人妻91麻豆一区二区三区| 国产欧美va欧美va香蕉在| 99香蕉国产精品偷在线观看|