最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring的Aware接口實(shí)現(xiàn)及執(zhí)行順序詳解

 更新時(shí)間:2022年12月26日 11:35:16   作者:刨紅薯的小羊竿爾  
這篇文章主要為大家介紹了Spring的Aware接口實(shí)現(xiàn)及執(zhí)行順序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、實(shí)現(xiàn)了Aware的接口

Spring中有很多繼承于aware中的接口,這些接口到底是做什么用到的,下面我們就一起來(lái)看看吧。

Aware 接口用于注入一些與容器相關(guān)信息,例如:

EnvironmentAware:實(shí)現(xiàn)EnvironmentAware接口重寫setEnvironment方法后,可以獲得配置文件屬性值

BeanClassLoaderAware:注入加載當(dāng)前 bean 的 ClassLoader

BeanNameAware: 注入當(dāng)前 bean 對(duì)應(yīng) beanName

BeanFactoryAware: 注入 當(dāng)前BeanFactory容器 的引用

ApplicationContextAware: 獲取容器本身ApplicationContext對(duì)象,可以在bean中得到bean所在的應(yīng)用上下文

EmbeddedValueResolverAware:獲取properties文件單個(gè)屬性值,一般使用@Value屬性值;EmbeddedValueResolverAware是另一種基于Spring解析獲取 properties 文件單個(gè)屬性值的方式

ApplicationEventPublisherAware:事件發(fā)布器的接口,使用這個(gè)接口,我們自己的bean就擁有了發(fā)布事件的能力。

ResourceLoaderAware:獲取ResourceLoader實(shí)例,獲取資源加載器讀取資源文件

二、為什么要使用 Aware 接口

Aware接口是回調(diào),監(jiān)聽器和觀察者設(shè)計(jì)模式的混合,一般指具備由Spring 容器通過(guò)Aware回調(diào)方法通知的特定的bean對(duì)象,簡(jiǎn)單來(lái)說(shuō)就是可以通過(guò)實(shí)現(xiàn)該接口拿到Spring容器內(nèi)部的一些資源。實(shí)際的回調(diào)方法由各個(gè)子接口確定,通常應(yīng)僅包含一個(gè)接受單個(gè)參數(shù)、返回 void 的方法;但是一般情況下,Spring不建議使用該接口,因?yàn)槭褂眠@種方式會(huì)將業(yè)務(wù)代碼與Spring 耦合,有所違背IOC 原則。

1、BeanNameAware

public class MyBeanName implements BeanNameAware {
    @Override
    public void setBeanName(String beanName) {
        System.out.println(beanName);
    }
}

2、BeanFactoryAware

public class MyBeanFactory implements BeanFactoryAware {
    private BeanFactory beanFactory;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
    public void getMyBeanName() {
        MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);
        System.out.println(beanFactory.isSingleton("myCustomBeanName"));
    }
}

3、EnvironmentAware

@Configuration
public class MyBatisConfig implements EnvironmentAware {
    private static Environment environment;
    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
    @Bean
    public DataSource druidDataSource() throws Exception {
        Properties props = new Properties();
        props.put("driverClassName", environment.getProperty("datasource.driverClassName"));
        props.put("url", environment.getProperty("datasource.url"));
        props.put("username", environment.getProperty("datasource.username"));
        props.put("password", environment.getProperty("datasource.password"));
        return DruidDataSourceFactory.createDataSource(props);
    }
}  

4、EmbeddedValueResolverAware

@Component
public class PropertiesUtil implements EmbeddedValueResolverAware {
    private StringValueResolver resolver;
    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.resolver = resolver;
    }
    /**
     * 獲取屬性,直接傳入屬性名稱即可
     * @param key
     * @return
     */
    public String getPropertiesValue(String key) {
        StringBuilder name = new StringBuilder("${").append(key).append("}");
        return resolver.resolveStringValue(name);
    }
}
public class MyBean implements BeanNameAware, ApplicationContextAware, InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(MyBean.class);
    @Override
    public void setBeanName(String name) {
        log.debug("當(dāng)前bean " + this + " 名字叫:" + name);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.debug("當(dāng)前bean " + this + " 容器是:" + applicationContext);
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        log.debug("當(dāng)前bean " + this + " 初始化");
    }
}

三、Aware接口執(zhí)行順序

定義類SimpleAware實(shí)現(xiàn)了部分Aware的接口的自定義bean,經(jīng)過(guò)程序運(yùn)行測(cè)試其執(zhí)行順序如下:

@Component
public class SimpleAware implements
        ApplicationContextAware,
        ApplicationEventPublisherAware,
        BeanClassLoaderAware,
        BeanFactoryAware,
        BeanNameAware,
        ResourceLoaderAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContextAware 回調(diào)");
    }
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        System.out.println("ApplicationEventPublisherAware 回調(diào)");
    }
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("BeanClassLoaderAware 回調(diào)");
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("BeanFactoryAware 回調(diào)");
    }
    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware 回調(diào)");
    }
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        System.out.println("ResourceLoaderAware 回調(diào)");
    }
}

按照以下順序執(zhí)行:

BeanNameAware-->BeanClassLoaderAware-->BeanFactoryAware-->ResourceLoaderAware-->ApplicationEventPublisherAware-->ApplicationContextAware

以上就是Spring的Aware接口實(shí)現(xiàn)及執(zhí)行順序詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring Aware接口執(zhí)行順序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?詳細(xì)分析四個(gè)經(jīng)典鏈表面試題

    Java?詳細(xì)分析四個(gè)經(jīng)典鏈表面試題

    兄弟們,編程,當(dāng)我們學(xué)習(xí)完數(shù)據(jù)結(jié)構(gòu)的時(shí)候,你就會(huì)有一種豁然開朗的感覺。算是真正的入了編程的門,所以打好數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)是特別特別重要的
    2022-03-03
  • SpringBoot項(xiàng)目中配置application.yml中server.port不生效的問(wèn)題

    SpringBoot項(xiàng)目中配置application.yml中server.port不生效的問(wèn)題

    這篇文章主要介紹了SpringBoot項(xiàng)目中配置application.yml中server.port不生效的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java排序算法總結(jié)之插入排序

    Java排序算法總結(jié)之插入排序

    這篇文章主要介紹了Java排序算法總結(jié)之插入排序,較為詳細(xì)的分析了插入排序的原理與java實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • SpringBoot中連接多個(gè)RabbitMQ的方法詳解

    SpringBoot中連接多個(gè)RabbitMQ的方法詳解

    這篇文章主要介紹了SpringBoot中連接多個(gè)RabbitMQ的方法詳解,要實(shí)現(xiàn) SpringBoot 連接多個(gè) RabbitMQ,只能自定義重寫一些東西,分別配置才可以,下面一起來(lái)走一下試試,需要的朋友可以參考下
    2023-10-10
  • Spring-cloud Config Server的3種配置方式

    Spring-cloud Config Server的3種配置方式

    這篇文章主要介紹了Spring-cloud Config Server的3種配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IDEA連接MySQL數(shù)據(jù)庫(kù)的4種方法圖文教程

    IDEA連接MySQL數(shù)據(jù)庫(kù)的4種方法圖文教程

    IDEA是一種流行的Java開發(fā)工具,可以方便地連接MySQL,這篇文章主要給大家介紹了關(guān)于IDEA連接MySQL數(shù)據(jù)庫(kù)的4種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Mybatis中自定義實(shí)例化SqlSessionFactoryBean問(wèn)題

    Mybatis中自定義實(shí)例化SqlSessionFactoryBean問(wèn)題

    這篇文章主要介紹了Mybatis中自定義實(shí)例化SqlSessionFactoryBean問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中I/O流讀取數(shù)據(jù)不完整的問(wèn)題解決

    Java中I/O流讀取數(shù)據(jù)不完整的問(wèn)題解決

    本文主要介紹了ava中I/O流讀取數(shù)據(jù)不完整的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 最新評(píng)論

    渝北区| 大城县| 额尔古纳市| 宜都市| 静安区| 马山县| 离岛区| 红原县| 温宿县| 镇安县| 云林县| 灌南县| 阿城市| 合山市| 靖西县| 沐川县| 镇安县| 紫金县| 南漳县| 交口县| 弥渡县| 青神县| 封开县| 南昌县| 斗六市| 荣成市| 榆树市| 迁西县| 鄢陵县| 沭阳县| 察雅县| 四子王旗| 周至县| 玛纳斯县| 云龙县| 天镇县| 崇义县| 明溪县| 岳阳县| 姜堰市| 大冶市|