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

Spring深入分析容器接口作用

 更新時(shí)間:2022年08月23日 10:03:30   作者:Spring是Java的春天  
Spring內(nèi)部提供了很多表示Spring容器的接口和對(duì)象,我們今天來(lái)看看幾個(gè)比較常見的容器接口和具體的實(shí)現(xiàn)類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.容器接口有哪些

在Spring中,容器接口有BeanFactory 接口和ApplicationContext 接口

其繼承關(guān)系如下(Ctrl + alt + u)

由這個(gè)繼承關(guān)系圖可以看出,ApplicationContext 接口是 BeanFactory 的子接口。它擴(kuò)展了 BeanFactory 接口的功能

而BeanFactory 才是 Spring 的核心容器, 主要的 ApplicationContext 實(shí)現(xiàn)都【組合】了它的功能

那么在哪里可以看見ApplicationContext 類呢?

就在SpringBoot的啟動(dòng)類中可以看見

@SpringBootApplication
@MapperScan("com.lingnan.mapper")
public class TestSpringbootApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(TestSpringbootApplication.class, args);
    }
}

SpringApplication.run()方法的返回值,則是ApplicationContext 的子類ConfigurableApplicationContext,也就是Spring容器

使用debug模式,可以清晰看見ApplicationContext 里面有BeanFactory ,并且BeanFactory 有很多單例

2.BeanFactory能干嘛

使用快捷鍵Ctrl + n查找BeanFactory,然后使用Ctrl + F12即可查看BeanFactory的方法

可以看到,BeanFactory接口的方法看起來(lái)并不多,只有g(shù)etBean

實(shí)際上控制反轉(zhuǎn)、基本的依賴注入、直至 Bean 的生命周期的各種功能, 都由它的實(shí)現(xiàn)類提供

3.ApplicationContext有哪些擴(kuò)展功能

通過(guò)前面的ApplicationContext 的繼承關(guān)系圖,不難看出,ApplicationContext 比BeanFactory多繼承了MessageSource、ResourcePatternResolver、EnvironmentCapable、ApplicationEventPublisher這幾個(gè)接口

這幾個(gè)接口也就是ApplicationEventPublisher的擴(kuò)展功能

MessageSource接口是用來(lái)提供處理國(guó)際化資源的能力,可以識(shí)別多國(guó)語(yǔ)言,相當(dāng)于翻譯

ResourcePatternResolver接口提供的是通配符匹配資源(磁盤或者類路徑下的文件)的能力

ApplicationEventPublisher接口則是可以用來(lái)發(fā)布事件對(duì)象

EnvironmentCapable接口提供了讀取Spring的一些環(huán)境信息的能力

3.1 MessageSource

MessageSource提供了getMessage方法,可以將語(yǔ)言翻譯成不同國(guó)家的語(yǔ)言

System.out.println(context.getMessage("hi", null, Locale.CHINA));
System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
System.out.println(context.getMessage("hi", null, Locale.JAPANESE));

這里就能將hi翻譯成中文、英語(yǔ)、日語(yǔ)

因?yàn)檫@個(gè)項(xiàng)目下提供了三個(gè)不同的文件,就會(huì)根據(jù)里面的鍵值對(duì)轉(zhuǎn)化為對(duì)應(yīng)的語(yǔ)言

3.2 ResourcePatternResolver

ResourcePatternResolver提供了getResources方法,可以根據(jù)路徑或者通配符獲取多個(gè)資源

public interface ResourcePatternResolver extends ResourceLoader {
	String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
	Resource[] getResources(String locationPattern) throws IOException;
}

當(dāng)然根據(jù)ResourcePatternResolver的父接口ResourceLoader,可以發(fā)現(xiàn)也可以獲取單個(gè)資源

public interface ResourceLoader {
   String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;
   Resource getResource(String location);
e org.springframework.util.ClassUtils#forName(String, ClassLoader)
    */
   @Nullable
   ClassLoader getClassLoader();
}

下面舉個(gè)栗子

Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
for (Resource resource : resources) {
    System.out.println(resource);
}

classpath是指當(dāng)前類路徑下(在jar包的話就需要像上面這樣加*),而Resource是Spring中對(duì)資源的抽象

3.3 EnvironmentCapable

EnvironmentCapable提供了getEnvironment方法,獲取當(dāng)前Spring的配置信息(環(huán)境變量、application.properties等)

public interface EnvironmentCapable {
   /**
    * Return the {@link Environment} associated with this component.
    */
   Environment getEnvironment();
}

可以借助Environment的父接口PropertyResolver提供的getProperty方法獲取某個(gè)配置信息

public interface Environment extends PropertyResolver {
   String[] getActiveProfiles();
   String[] getDefaultProfiles();
   @Deprecated
   boolean acceptsProfiles(String... profiles);
   boolean acceptsProfiles(Profiles profiles);
}

舉個(gè)栗子

System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("server.port"));

這樣就能獲取到環(huán)境變量和server.port端口號(hào)了

3.4 ApplicationEventPublisher

ApplicationEventPublisher的作用是用來(lái)發(fā)布事件的

@FunctionalInterface
public interface ApplicationEventPublisher {
   default void publishEvent(ApplicationEvent event) {
      publishEvent((Object) event);
   }
   void publishEvent(Object event);
}

ApplicationEventPublisher提供了一個(gè)publishEvent方法用來(lái)發(fā)布事件

而事件則需要繼承ApplicationEvent,source代表事件源,也就是誰(shuí)發(fā)的事件

public class UserRegisteredEvent extends ApplicationEvent {
    public UserRegisteredEvent(Object source) {
        super(source);
    }
}

然后就可以調(diào)用publishEvent來(lái)發(fā)送事件,參數(shù)為context,因?yàn)閏ontext是事件源,也就是context發(fā)的事件

context.publishEvent(new UserRegisteredEvent(context));

除了發(fā)事件,還應(yīng)該有收事件的東西,也就是監(jiān)聽器

Spring中任何一個(gè)類都可以作為監(jiān)聽器

需要加上 @EventListener注解

然后參數(shù)為事件,也就是發(fā)的事件是什么類型,接收的事件也應(yīng)該是什么類型

@Component
public class Component2 {
    private static final Logger log = LoggerFactory.getLogger(Component2.class);
    @EventListener
    public void aaa(UserRegisteredEvent event) {
        log.debug("{}", event);
        log.debug("發(fā)送短信");
    }
}

這樣就可以了,其實(shí)這種操作很像mq,可以用來(lái)異步處理某些業(yè)務(wù)

比如我這里有一個(gè)注冊(cè)方法,然后異步需要發(fā)送短信,那么發(fā)布事件之后,aaa方法就會(huì)異步執(zhí)行

@Component
public class Component1 {
    private static final Logger log = LoggerFactory.getLogger(Component1.class);
    @Autowired
    private ApplicationEventPublisher context;
    public void register() {
        log.debug("用戶注冊(cè)");
        context.publishEvent(new UserRegisteredEvent(this));
    }
}

到此這篇關(guān)于Spring深入分析容器接口作用的文章就介紹到這了,更多相關(guān)Spring容器接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中使用MongoDB的連接池配置

    SpringBoot中使用MongoDB的連接池配置

    由于MongoDB的客戶端本身就是一個(gè)連接池,因此,我們只需要配置客戶端即可,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java緩存ehcache的使用步驟

    Java緩存ehcache的使用步驟

    這篇文章主要介紹了Java緩存ehcache的使用步驟,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • java  Vector和ArrayList的分析及比較

    java Vector和ArrayList的分析及比較

    這篇文章主要介紹了java Vector和ArrayList的分析及比較的相關(guān)資料,Vector是多線程安全的,而ArrayList不是,本文主要做對(duì)比對(duì)這兩個(gè)方法,需要的朋友可以參考下
    2016-11-11
  • Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問(wèn)題

    Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問(wèn)題

    YYYY-MM-dd可能會(huì)導(dǎo)致跨年周的日期被歸屬到錯(cuò)誤的年份, yyyy-MM-dd總是表示實(shí)際的日歷年份,無(wú)論日期所在的周是否跨年,本文就來(lái)介紹一下兩者的區(qū)別,感興趣的可以了解一下
    2024-01-01
  • Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案

    Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案

    實(shí)體類中有一個(gè) List<String> 類型的屬性,對(duì)應(yīng)于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查詢時(shí)能互相轉(zhuǎn)換,本文給大家介紹Java中的List和MySQL中的varchar相互轉(zhuǎn)換的解決方案,需要的朋友可以參考下
    2024-06-06
  • java遞歸設(shè)置層級(jí)菜單的實(shí)現(xiàn)

    java遞歸設(shè)置層級(jí)菜單的實(shí)現(xiàn)

    本文主要介紹了java遞歸設(shè)置層級(jí)菜單的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java中HashMap的常見用法詳解

    Java中HashMap的常見用法詳解

    這篇文章主要介紹了Java中HashMap的常見用法詳解,HashMap是Java中的一個(gè)常用子類,它是java.util.HashMap<k,v>集合,實(shí)現(xiàn)了Map<k,v>接口, HashMap可以存儲(chǔ)鍵值對(duì),通過(guò)鍵來(lái)快速訪問(wèn)值,在HashMap中,鍵是唯一的,而值可以重復(fù),需要的朋友可以參考下
    2023-09-09
  • Mybatis-plus配置分頁(yè)插件返回統(tǒng)一結(jié)果集

    Mybatis-plus配置分頁(yè)插件返回統(tǒng)一結(jié)果集

    本文主要介紹了Mybatis-plus配置分頁(yè)插件返回統(tǒng)一結(jié)果集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java BIO實(shí)現(xiàn)聊天程序

    Java BIO實(shí)現(xiàn)聊天程序

    這篇文章主要為大家詳細(xì)介紹了Java BIO實(shí)現(xiàn)聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringCloud的Gateway網(wǎng)關(guān)詳解

    SpringCloud的Gateway網(wǎng)關(guān)詳解

    這篇文章主要介紹了SpringCloud的Gateway網(wǎng)關(guān)詳解,Gateway 是 Spring Cloud 官方推出的一個(gè)基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 網(wǎng)關(guān)實(shí)現(xiàn),本文將介紹 Spring Cloud Gateway 的基本概念、核心組件以及如何配置和使用它,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

长丰县| 巴林右旗| 万宁市| 内黄县| 比如县| 谢通门县| 瑞昌市| 平果县| 涪陵区| 巨鹿县| 东光县| 台北县| 鄂托克前旗| 临漳县| 和硕县| 洛川县| 静宁县| 咸阳市| 安义县| 综艺| 西昌市| 山东省| 儋州市| 海城市| 阳朔县| 武乡县| 临朐县| 垣曲县| 都匀市| 惠安县| 北京市| 六安市| 怀柔区| 磐石市| 遂溪县| 青龙| 井冈山市| 乐山市| 崇礼县| 宿迁市| 灌云县|