spring framework源代码 翻译(一)

最近帮着做一个项目,用到了spring框架,以前学习过servlet和jsp的东西,但是因为没有具体做项目,也没用过类似spring、strust这样的框架。这次有机会,挤时间深入学习一下spring

看资料上边,spring框架核心主要有三部分,Bean、Context和Core,其他组件都是在它们的基础上发展的。用资料上的比喻,就像演员演出,Bean就是那些演员,而Context就是演出的舞台,建立这些演员之间出场的顺序(关系)等,而Core就是发现、建立和维护这些关系的工具。

那么首先看一下演员,就是那些Bean,它们包装着对象或数据。Bean组件在org.springframework.beans下,此包下所有的类主要做了三件事:Bean的定义、创建与解析,对spring的使用者来说唯一需要关心的就是bean的创建,其他由spring自动完成,对使用者透明。

Bean创建采用了工厂模式,顶级接口就是BeanFactory,第一次的代码翻译就从BeanFactory开始吧。

/**
 * spring bean 容器的最顶级接口,所有的bean窗口都是或实现了它的接口及子接口

 * 子接口,如ListableBeanFactory和org.springframework.beans.factory.config.ConfigurableBeanFactory

 * 本接口由持有bean definition的对象实现,这些definition对象均由各自的name来唯一标识。  根据bean definition,

 * 返回一个所包含对象的独立实例(Prototype设计模式)或者对象的共享引用(单例模式)

 *具体根据工厂类的配置来决定,二者的API是相同的。从spring2.0开始,引入了更多的域(scope)的概念,如网络环境中的

 * resquest和session scope,因此,单例模式也要考虑这些域。

 * 本接口的的关键在于 BeanFactory类是应用组件的核心注册地,同时集中进行了这些组件的相关配置,使用都不必使用其他的类去读取配置文件
 *
 * spring的依赖注入机制就是靠BeanFactory和它的子接口实现的

 *
 * 一般来说,BeanFactory会从配置源(如xml文件)中加载bean definition,并使用org.springframework.beans包中的工具类来配置这些bean

 *
 * 与ListableBeanFacotry(它的一个子接口)不同的是,HierarchicalBeanFactory(也是它的一个子接口,与ListableBeanFactory处于同一层次,直接继承BeanFactory) 接** 口的所有方法也会检查父工厂类以返回某一bean实例,如果某一个bean不存在于本工厂实例,它会向上查找其父类。同时,这种接口的实现类的子类中的bean会覆盖父类中  * 的同名bean,使其不可见。
 *
 * <p>Bean factory 的实现类同时需要尽量实现bean的生命周期管理(下面有一些具体的生命周期管理及调用的方法,但是因为刚开始看代码,所以不是太懂,暂时先删了,以后再加上)
 
public interface BeanFactory {


/**
* 成员变量用来解引用一个FactoryBean实例,同时使它区别于它所创建的beans,

* 比如,如果一个类名为 myJndiObject的类是 FactoryBean类, 那么&myJndiObject会返回这个类的实例,而不是它所产生的bean类的实例
*/
String FACTORY_BEAN_PREFIX = "&";


/**
* 返回bean实例,不管bean的配置是单例还是prototype.

* 如果参数为类的别名,那么会将它转换加其原始的bean名称,同时返回实例。还会查找父类中是否有其实例
*/
Object getBean(String name) throws BeansException;


/**
* 与getBean(String)作用相同,但是提供了类型安全策略,保证名称name的bean的类型是参数中指定的类型 

* 也意味着不能throw ClassCastException异常,而必须进行捕获并处理。
*/
<T> T getBean(String name, Class<T> requiredType) throws BeansException;


/**
* 如果存在的话,返回符合类型的bean实例,
* 参数类型可以为接口或者父类,但是不能为null
*/
<T> T getBean(Class<T> requiredType) throws BeansException;


/**
* 返回bean实例,允许显式指定构造器参数/工厂方法参数以覆盖默认的bean definition中的配置参数
*/
Object getBean(String name, Object... args) throws BeansException;


/**
*本工厂中是否包含bean类,不管bean definition是实体还是抽象的,懒惰还是饥饿的,是否在作用域中,只要查找到,都会返回true

* 因此,调用本方法并不保证getBean(name)会获得bean实例
*/
boolean containsBean(String name);


/**
*是否为单例模式
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;


/**
* 是否为原型模式
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;


/**
* 查检bean name与类型是否匹配,再具体点,就是检查getBean(name)返回的object对象是否能赋予某一类型变量
*/
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;


/**
* 返回name对应的bean类型. 再具体一点,就是确定getBean(name)返回对象的类型
* 对于FactoryBean,返回FactoryBean创建的对象的类型
* 等同FactoryBean#getObjectType().

*/
Class<?> getType(String name) throws NoSuchBeanDefinitionException;


/**
* 返回特定bean的别名

 * 用这些别名调用getBean()方法时的返回值指向相同的bean对象
 * 如果传入的参数是一个别名,那么对应的原始名称和其他别名会被返回,并且原始名称是数组的第一个元素
* 此方法会询问父工厂在其中是否有名称对应的bean对象 

* @see #getBean
*/
String[] getAliases(String name);


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值