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

Spring深入分析容器接口作用

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

1.容器接口有哪些

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

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

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

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

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

就在SpringBoot的啟動類中可以看見

@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接口的方法看起來并不多,只有g(shù)etBean

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

3.ApplicationContext有哪些擴展功能

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

這幾個接口也就是ApplicationEventPublisher的擴展功能

MessageSource接口是用來提供處理國際化資源的能力,可以識別多國語言,相當于翻譯

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

ApplicationEventPublisher接口則是可以用來發(fā)布事件對象

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

3.1 MessageSource

MessageSource提供了getMessage方法,可以將語言翻譯成不同國家的語言

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翻譯成中文、英語、日語

因為這個項目下提供了三個不同的文件,就會根據(jù)里面的鍵值對轉(zhuǎn)化為對應的語言

3.2 ResourcePatternResolver

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

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

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

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();
}

下面舉個栗子

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

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

3.3 EnvironmentCapable

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

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

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

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

舉個栗子

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

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

3.4 ApplicationEventPublisher

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

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

ApplicationEventPublisher提供了一個publishEvent方法用來發(fā)布事件

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

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

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

context.publishEvent(new UserRegisteredEvent(context));

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

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

需要加上 @EventListener注解

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

@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ā)送短信");
    }
}

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

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

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

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

相關(guān)文章

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

    SpringBoot中使用MongoDB的連接池配置

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

    Java緩存ehcache的使用步驟

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

    java Vector和ArrayList的分析及比較

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

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

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

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

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

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

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

    Java中HashMap的常見用法詳解

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

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

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

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

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

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

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

最新評論

平湖市| 洪湖市| 长泰县| 金山区| 图们市| 沿河| 吴旗县| 辽宁省| 大关县| 始兴县| 辽宁省| 富源县| 顺平县| 兴业县| 凉城县| 凯里市| 皮山县| 昌图县| 胶南市| 双辽市| 海口市| 托里县| 沈阳市| 万载县| 千阳县| 牙克石市| 大姚县| 泾川县| 特克斯县| 方城县| 永昌县| 台州市| 神池县| 吉林省| 江口县| 易门县| 涡阳县| 瑞安市| 紫阳县| 清远市| 长兴县|