繼續(xù)接著講
prepareBeanFactory()的流程,這一步的主要作用是BeanFactory的預(yù)準(zhǔn)備工作,也就是對(duì)BeanFactory進(jìn)行一些初始化后的設(shè)置;
進(jìn)入這個(gè)方法的實(shí)現(xiàn)之前,我們來(lái)看下方法上面的注釋,Configure the factory's standard context characteristics, such as the context's ClassLoader and post-processors.翻譯后的大概意思就是:設(shè)置這個(gè)BeanFactory的標(biāo)準(zhǔn)上下文特性,比如比如上下文的類加載器和后置處理器。傳進(jìn)來(lái)的參數(shù)是待配置的beanFactory。ok,看下其源碼:
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
首先:
1.設(shè)置BeanFactory的BeanClassLoader,如果存在,則直接使用之前的那個(gè),否則,初始化一個(gè)新的ClassLoader;
2.設(shè)置BeanExpressionResolver表達(dá)式解析器,主要用來(lái)解析EL表達(dá)式;那么什么時(shí)候會(huì)進(jìn)行EL表達(dá)式的解析嘞?可以提前劇透下,也就是在Bean進(jìn)行初始化后會(huì)有屬性填充的一步,方法如下:
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
...
//屬性填充
applyPropertyValues(beanName, mbd, bw, pvs);
}
在這一步中會(huì)調(diào)用BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter); 來(lái)進(jìn)行屬性值的解析;而接下來(lái)便是通過(guò)AbstractBeanFactory中的evaluateBeanDefinitionString方法進(jìn)行解析,解析代碼如下:
protected Object evaluateBeanDefinitionString(String value, BeanDefinition beanDefinition) {
if (this.beanExpressionResolver == null) {
return value;
}
Scope scope = (beanDefinition != null ? getRegisteredScope(beanDefinition.getScope()) : null);
return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));
}
然后這時(shí)候就進(jìn)到StandardBeanExpressionResolver中的evaluate方法中進(jìn)行解析了;
3.設(shè)置屬性注冊(cè)解析器PropertyEditor;這個(gè)主要是對(duì)某些注入的Bean的一些屬性的支持;
4.設(shè)置ApplicationContextAwareProcessor的支持,關(guān)于BeanPostProcessor的作用我這里不在贅述,在這個(gè)地方僅僅是注冊(cè),真是的實(shí)現(xiàn)還是在ApplicationContextAwareProcessor的內(nèi)部,先看其前置處理.
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
AccessControlContext acc = null;
if (System.getSecurityManager() != null &&
(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
acc = this.applicationContext.getBeanFactory().getAccessControlContext();
}
if (acc != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareInterfaces(bean);
return null;
}
}, acc);
}
else {
invokeAwareInterfaces(bean);
}
return bean;
}
首先就是校驗(yàn)權(quán)限,然后就是判斷Aware的類型,然后調(diào)用invokeAwareInterfaces,這樣實(shí)現(xiàn)了這些Aware接口的Bean在被初始化之后就能取到響應(yīng)的資源.
再看其后置處理器,啥事沒(méi)干,直接返回Bean:
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
接下來(lái)就是設(shè)置忽略自動(dòng)裝配的屬性:
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
當(dāng)Spring將ApplicationContextAwareProcessor注冊(cè)后,已經(jīng)注冊(cè)了EnvironmentAware.class, EmbeddedValueResolverAware.class, ResourceLoaderAware.class, ApplicationEventPublisherAware.class,
MessageSourceAware.class,
ApplicationContextAware.class,
這些內(nèi)容,那么在Spring做Bean的注入的時(shí)候肯定是要忽略他們的;
再往下走就是注冊(cè)依賴了,這里沒(méi)啥好說(shuō)的,就是當(dāng)檢查到依賴時(shí),將依賴的實(shí)例進(jìn)行注冊(cè);
接下來(lái)又是注冊(cè)后置處理器ApplicationListenerDetector,這里主要是檢測(cè)是否有事件監(jiān)聽(tīng);
以及判斷是否有對(duì)編譯時(shí)AspectJ的支持,這些都是通過(guò)后置處理器來(lái)完成的,最后主要是給BeanFactory注冊(cè)一些能通用的組件。
好了,這一節(jié)內(nèi)容不多,感覺(jué)自己說(shuō)了好多廢話,但是也是為了能將內(nèi)容講明白,不足之處望大街指出,下一節(jié)我們講BeanFactory的后置處理,敬請(qǐng)期待!