第五章 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
- BeanFactoryPostProcessor介面及子介面BeanDefinitionRegistryPostProcessor是spring ApplicationContext一個非常重要的一個體系,spring-boot使用spi體系,就應該廢除這個體系了。
- ApplicationListener 事件執行
- ProtocolResolver,用於對載入的資源進行處理
- refresh方法是核心方法,會有一節專門說。
- 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檔案
- ClassPathXmlApplicationContext
這個是載入classPath路徑,記住classPath是指的的jar包裡面或者bin目錄。
- FileSystemXmlApplicationContext
給予一個檔案系統的地址,遠端載入xml檔案
- XmlWebApplicationContext
這個是從web的classPath路徑,也就是web.class目錄下載入
- GenericXmlApplicationContext
與ClassPathXmlApplicationContext載入方式一樣,只是其他行為不一樣
載入groovy語言的檔案
- GroovyWebApplicationContext
- GenericGroovyApplicationContext
載入annitation
- AnnotationConfigApplicationContext
- AnnotationConfigWebApplicationContext
手動注入bean
- GenericApplicationContext
- ResourceAdapterApplicationContext
- StaticApplicationContext
- StaticWebApplicationContext
使用環境維度
web應用
- AnnotationConfigWebApplicationContext
- AnnotationConfigApplicationContext
- GenericWebApplicationContext
- StaticWebApplicationContext
正常專案維度
其他都是
Refreshable
Refreshable特性
- AnnotationConfigWebApplicationContext
- GroovyWebApplicationContext
- XmlWebApplicationContext
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
非Refreshable特性
其他都是
暈了吧
鳥菜啊已經暈過了,現在清醒了。找了兩個現在使用的ApplicationContext的切入。分別是AnnotationConfigApplicationContext與AnnotationConfigWebApplicationContext。請大家慢慢有耐心的聽鳥菜啊悠悠的