1. 程式人生 > >第五章 spring-context之ApplicationContext體系

第五章 spring-context之ApplicationContext體系

前言

ApplicationContext(應用上下文)是使用spring框架的入口。深入理解,運用ApplicationContext的每個細節。會對spring的擴充套件,解決一些細節行問題。有巨大的幫助

ApplicationContext介面體系

ApplicationContext介面會繼承許多其他介面。以下是繼承的介面

MessageSource

從英文單詞可以看出是訊息源,這個介面主要用於國際化操作。冒失國際化操作用得好少,JavaScript,或者後端又更加優秀的國際化操作的處理。所以MessageSource體系不會講解。

public interface MessageSource {

	String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);

	String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;

	String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}

EnvironmentCapable

從英文單詞可以看出是環境變數(應用變數)管理。細節請看第五章 第一節 spring-connet之environment

public interface EnvironmentCapable {
	Environment getEnvironment();
}

HierarchicalBeanFactory 與 ListableBeanFactory

請看beanFacrt

ApplicationEventPublisher

ApplicationEventPublisher介面所對應的子體系是ApplicationContext體系裡面一個非常重要的體系,是ApplicationContext控制的非常重要,如果深入使用spring,ApplicationEventPublisher體系是應該掌握的。ApplicationEventPublisher的publishEvent()方法表示執行那個ApplicationContext的事件。

public interface ApplicationEventPublisher {

	default void publishEvent(ApplicationEvent event) {
		publishEvent((Object) event);
	}

	void publishEvent(Object event);

}

ResourcePatternResolver

ResourcePatternResolver是你不會知道,也不會主動去了解的體系,但這個體系是ApplicationContext現在(現在,現在)最核心的基礎工具。用於載入資源。

public interface ResourcePatternResolver extends ResourceLoader {
	String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

	Resource[] getResources(String locationPattern) throws IOException;
}

ApplicationContext

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

	String getId();

	String getApplicationName();

	String getDisplayName();

	long getStartupDate();

	ApplicationContext getParent();

	AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;

}

Lifecycle

生命週期,大家應該都懂的

public interface Lifecycle {

	void start();

	void stop();

	boolean isRunning();
}

Closeable

大家會很奇怪,Closeable的close方法與Lifecycle的stop是不是重複了。這個不一定。比如strat-stop-start 這種週期迴圈了。close等於宇宙直接毀滅了。但是如果stop也等於宇宙直接毀滅,那麼兩者是相等的。沒事,我立馬拯救宇宙,現在宇宙進入和平時期。

public interface Closeable extends AutoCloseable {

    public void close() throws IOException;
}

ConfigurableApplicationContext

  1. BeanFactoryPostProcessor介面及子介面BeanDefinitionRegistryPostProcessor是spring ApplicationContext一個非常重要的一個體系,spring-boot使用spi體系,就應該廢除這個體系了。
  2. ApplicationListener 事件執行
  3. ProtocolResolver,用於對載入的資源進行處理
  4. refresh方法是核心方法,會有一節專門說。
  5. isActive方法是確定ApplicationContext是否正常啟動。
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {

	void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);

	void addApplicationListener(ApplicationListener<?> listener);

	void addProtocolResolver(ProtocolResolver resolver);

	void refresh() throws BeansException, IllegalStateException;

	void registerShutdownHook();

	boolean isActive();
}

ConfigurableWebApplicationContext

ConfigurableWebApplicationContext很簡單,加入了一些web專案需要的基本資訊

public interface ConfigurableWebApplicationContext extends WebApplicationContext, ConfigurableApplicationContext {

	void setServletContext(ServletContext servletContext);

	void setServletConfig(ServletConfig servletConfig);

	ServletConfig getServletConfig();

	void setNamespace(String namespace);

	String getNamespace();

	void setConfigLocation(String configLocation);

	void setConfigLocations(String... configLocations);

	String[] getConfigLocations();

}

非ApplicationContext介面繼承的其他介面體系

AnnotationConfigRegistry介面

AnnotationConfigRegistry 有兩個方法宣告,第一個register是直接解析class。第二個scan是提供路徑,進行路徑掃描。

public interface AnnotationConfigRegistry {

	void register(Class<?>... annotatedClasses);

	void scan(String... basePackages);

}

ApplicationContext 實現體系

看了這個複雜的圖,是不是懵避了,先前鳥菜啊也懵得不行。不要急,待已經懵完的鳥菜啊,給大家解讀。

資源載入的維度

載入xml檔案
  1. ClassPathXmlApplicationContext

    這個是載入classPath路徑,記住classPath是指的的jar包裡面或者bin目錄。

  2. FileSystemXmlApplicationContext

    給予一個檔案系統的地址,遠端載入xml檔案

  3. XmlWebApplicationContext

    這個是從web的classPath路徑,也就是web.class目錄下載入

  4. GenericXmlApplicationContext

    與ClassPathXmlApplicationContext載入方式一樣,只是其他行為不一樣

載入groovy語言的檔案
  1. GroovyWebApplicationContext
  2. GenericGroovyApplicationContext
載入annitation
  1. AnnotationConfigApplicationContext
  2. AnnotationConfigWebApplicationContext
手動注入bean
  1. GenericApplicationContext
  2. ResourceAdapterApplicationContext
  3. StaticApplicationContext
  4. StaticWebApplicationContext

使用環境維度

web應用
  1. AnnotationConfigWebApplicationContext
  2. AnnotationConfigApplicationContext
  3. GenericWebApplicationContext
  4. StaticWebApplicationContext

正常專案維度

其他都是

Refreshable

Refreshable特性

  1. AnnotationConfigWebApplicationContext
  2. GroovyWebApplicationContext
  3. XmlWebApplicationContext
  4. ClassPathXmlApplicationContext
  5. FileSystemXmlApplicationContext

非Refreshable特性

其他都是

暈了吧

鳥菜啊已經暈過了,現在清醒了。找了兩個現在使用的ApplicationContext的切入。分別是AnnotationConfigApplicationContext與AnnotationConfigWebApplicationContext。請大家慢慢有耐心的聽鳥菜啊悠悠的