css的源码学习日志--spring IoC, AOP

基于spring 3.1.0.
IoC和AOP是spring的基础。先看IoC。接口以BeanFactory和ApplicationContext为中心,abstractBeanFactory有很多实现。从ClassPathXmlApplicationContext开始。(添加了resource管理)。从refresh()开始。
初始化
  Resource Loader
  load BeanDefinition
    Reader
    register
      documentReader
      BeanDefinitionParserDelegate
  Registry(FactoryBeanRegistrySupport.ConcurrentHashMap)
依赖注入(getBean), abstractBeanFactory.getObjectForBeanInstance(),
FactoryBeanRegistrySupport.getObjectFromFactoryBean(),doGetObjectFromFactoryBean(),注意这里factory.getObject();实现FactoryBean.

初始化只是load beanDefinition,注入在getBean时发生,若有循环引用对singleton不会有问题,对prototype有检测,若被引用bean则在creating中则抛异常。

--AOP
概念:advice, pointcut, advisor.
以ProxyFactoryBean为例。它是一个BeanFactoryAware可得到BeanFactory,同时在init Bean的时候会调其getObject方法因此可实现其Factory的作用返回proxy。aopproxy有两种:jdk**proxy, cglib**proxy,以不同的方式(分别调invoke, intercept)在其中调用ReflectiveMethodInvocation.proceed()。若没有advise则直接调用方法,有makeAccessible。

来看proceed()。从chain中取matcher(advisor)或interceptor,前者根据其matcher调interceptor后者直接调。

来看chain怎么从配置中来。其来自***Proxy中的AdvisedSupport advised;从getInterceptorsAndDynamicInterceptionAdvice入手,其从DefaultAdvisorChainFactory中读,由AdvisorAdapterRegistry完成,而参数来自于AdvisedSupport的advisors.这个advisors要回到ProxyFactoryBean.initializeAdvisorChain(),从beanFactory.getBean()取得advice并add, ProxyBeanFactory是一个autowirecapableBeanFactory所以在init它自身的时候会被设置BeanFactory本身,给予它感知factory的能力。

注意以上概念,我们要织入的是advice,但是chain里是interceptor,这里有不一致。这就是adapter的作用。三种adviceAdapter将advice包装成interceptor,放到chain中。包装的时候分别完成before, after, around等功能。

----注:

bean在装载的时候就放到factoryBeanObjectCache或其它不同的cache中决定了bean的种类。

----springMVC:

了解IoC和AOP后这里就简单了。在web.xml中一个listener一个dispatcherServlet. listener是一个ContextLoader去init webapplicationContext. 见其configureAndRefreshWebApplicationContext(wac, sc)通过sc设置wac并refresh(),即开始了从xml加载beans的过程。这里有determineContextClass()得到 wac的具体实现。然后设置到上下文sc中。

在dispatcherServlet中, FrameworkServlet.findWebApplicationContext()从utils(sc)得到wac。

猜你喜欢

转载自chenss.iteye.com/blog/2051844