您的位置:首页 > 编程语言 > Java开发

spring部分源码分析

2014-06-27 16:37 169 查看
如果里面有什么不妥之处,敬请谅解。

Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

Spring的核心无疑是BeanFactory, ApplicationContext和AOP。在“Spring AOP编程”教程的例子中,是由ProxyFactoryBean来实现的。普通的bean和FactoryBean的配置完全是一样的。那么,BeanFactory是如何区分普通的Bean和用作Proxy的FactoryBean的?ProxyFactoryBean又是怎样实现AOP 功能的?

FactoryBean的职责

FactoryBean在Spring中被当成一种特殊的bean,通过实现FactoryBean接口进行扩展。FactoryBean的职责是:

l.封装了创建对象或查找对象的逻辑。

2.提供了一个中间层,用于支持AOP。

这样,客户程序并不知道myService的实现细节,Spring使用FactoryBean完成了两者之间的解耦

FactoryBean源代码分析

如果bean实现了FactoryBean接口,BeanFactory将把它作为一个bean工厂,而不是直接作为普通的bean。正常情况下, BeanFactory的getBean("bean")返回FactoryBean生产的bean实例,如果要返回FactoryBean本身的实例, 使用getBean("&bean")的调用方式。

在分析ProxyFactoryBean之前,我们先分析BeanFactory,它是Spring Framework的基础。

我们看看它是如何分别处理普通的Bean和FactoryBean的。

BeanFactory分析

XmlBeanFactory继承了AbstactBeanFactory抽象类。AbstactBeanFactory类中使用了 Template Method设计模式,其中的模板方法为getBeanDefinition()和createBean()两个抽象方法。其中 AbstractAutowireCapableBeanFactory类实现了getBeanDefinition()方法, DefaultAutowireCapableBeanFactory类实现了getBeanDefinition()方法。当调用getBean()方法时,AbstractBeanFactory类定义的逻辑分别调用了这两个模板方法。

BeanFactory类的调用顺序

我们暂时不使用ApplicationContext,以简化分析过程。我在这里使用了“Spring AOP编程”的例子,请参照该教程阅读。首先,编写测试用例,代码如下:

1. 首先,XmlBeanFactory使用XmlBeanDefinitionReader读入testaop.xml配置文件,后者用 XmlBeanDefinitionParser和DefaultXmlBeanDefinitionParser进行分析,从中得到 BeanDefinition的信息,并保存在XmlBeanDefinitionReader的BeanDefinitionRegistry变量里。

2. 客户程序调用getBean方法时,AbstractBeanFactory首先使用transFormedBeanName方法分析传入的Bean名称,判断客户程序需要FactoryBean本身,还是它所创建的Bean对象。

3. 接下来,如果bean被定义为singleton模式,AbstractBeanFactory调用createBean方法根据 BeanDefinition信息实例化bean类,然后将该bean实例传给getObjectForSharedInstance方法并返回getObjectForSharedInstance的返回对象。GetObjectForSharedInstance方法摘要如类图所示,首先判断bean是否继承了FactoryBean。如果是,返回FactoryBean的getObject方法(下节我将详细分析使用
ProxyFactoryBean如何实现AOP);如果不是,返回bean对象。

4. 如果bean被定义为prototype模式,每次客户程序请求都会生成新的bean实例,因此,createBean方法直接实例化bean对象并返回。

实现AOP的过程

ProxyFactoryBean类继承了AdvisedSupport类,后者继承了ProxyConfig类并定义了操作advisor 和interceptor的接口,以支持AOP。当BeanFactory实例化ProxyFactoryBean时,根据配置文件的定义将关于 advice,pointcut,advisor,所代理的接口和接口实现类的所有信息传给ProxyFactoryBean。

当客户程序调用BeanFactory的getBean方法时,ProxyFactory使用JdkDynamicAopProxy实例化 BeanImpl类,并用JdkDynamicAopProxy的invoke方法执行advice。至于执行advice的时机,由 ProxyFactoryBean调用RegexpMethodPointcutAdvisor进行判断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: