第五章 spring-context之ApplicationContext體系

前言

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

ApplicationContext接口體系

ApplicationContext接口會繼承許多其餘接口。如下是繼承的接口web

MessageSource

從英文單詞能夠看出是消息源,這個接口主要用於國際化操做。冒失國際化操做用得好少,JavaScript,或者後端又更加優秀的國際化操做的處理。因此MessageSource體系不會講解。spring

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的事件。spring-boot

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

生命週期,你們應該都懂的post

public interface Lifecycle {

	void start();

	void stop();

	boolean isRunning();
}

Closeable

你們會很奇怪,Closeable的close方法與Lifecycle的stop是否是重複了。這個不必定。好比strat-stop-start 這種週期循環了。close等於宇宙直接毀滅了。可是若是stop也等於宇宙直接毀滅,那麼二者是相等的。沒事,我立馬拯救宇宙,如今宇宙進入和平時期。spa

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項目須要的基本信息.net

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。請你們慢慢有耐心的聽鳥菜啊悠悠的講解。

相關文章
相關標籤/搜索