spring 源码学习笔记(一)

最近下载了spring1.2.6的源码,配置了个环境,然后就开始学习大师的杰作,心想学习后写点笔记是必要的,于是在javaeye记录下本人学习的过程以及心得体会与大家分享。本人还属菜鸟一族,菜鸟容易犯菜鸟级的错误,希望各路大侠嘴下留情,也诚请高手指点迷津。


一、首先看下struts(1.2)和spring是怎么整合的
 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property value="/WEB-INF/classes/applicationContext.xml" property="contextConfigLocation"/>
</plug-in>

DelegatingRequestProcessor继承struts的控制器RequestProcessor,配置后请求在经过中心处理器ActionServlet后,分发到DelegatingRequestProcessor进行处理,DelegatingRequestProcessor有个上下文对象webApplicationContext,tomcat初始化的时候会调用DelegatingRequestProcessor.initWebApplicationContext()对上下文对象进行初始化。上下文中存有applicationContext.xml中配置的bean,程序将通过下面的方法获取容器中的bean,而不是直接实例化:
protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
String beanName = determineActionBeanName(mapping);
return (Action) this.webApplicationContext.getBean(beanName, Action.class);
}


ContextLoaderPlugIn继承自org.apache.struts.action.PlugIn,用于加载spring的配置环境applicationContext.xml到struts的ActionServlet中,通过actionServlet.getServletContext().getAttribute("")可以取到。ActionServlet通过initModulePlugIns(ModuleConfig config)来初始化插件:

PlugInConfig plugInConfigs[] = config.findPlugInConfigs();
PlugIn plugIns[] = new PlugIn[plugInConfigs.length];
…………

plugIns[i].init(this, config);



二、觉得BeanPostProcessor这个名字比较怪,初看不知道是干什么用的,金山词霸对post processor的解释是“后置处理程序”,BeanPostProcessor应该就是在bean实例化之后,对bean进行一些加工,比如设置某些参数或者将bean用代理进行包装等。

public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}


bean = applyBeanPostProcessorsBeforeInitialization(bean, beanName);
invokeInitMethods(beanName, bean, mergedBeanDefinition);
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);


public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (Iterator it = getBeanPostProcessors().iterator(); it.hasNext();) {
BeanPostProcessor beanProcessor = (BeanPostProcessor) it.next();
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
if (result == null) {
throw new BeanCreationException(beanName,"");
}
}
return result;
}

getBeanPostProcessors()获取所有需要后置处理的BeanPostProcessor,然后遍历调用postProcessBeforeInitialization()方法,有点类似于“观察者”模式。从这里可以体会到面向接口编程的好处,有了统一的接口才能像这样遍历调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值