Spring2.0研究(一)

本文详细介绍了Spring框架中的IoC容器概念及其工作原理,包括BeanFactory接口的角色、Bean的定义及其配置方式等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        一直在使用Spring,感慨良多,有欣赏也有不屑。如今spring2.0出现了,趁此机会对它进行一个深入的研究,以便印证自己的一些想法,同时也理解Spring的演进。
本文将以章节的形式出现,以反映笔者的进程。
一、             IoC
1.1   容器和Bean的原理
1.1.1    容器
Spring文档中的这张示意图很好的反映了“容器”一词在Spring中的含义。
                首先spring将读取我们配置的原数据并通过他对应用中的各个对象进行实例化、配置和组装org.springframework.beans.factory.BeanFactorySpring IoC容器的实际代表者,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。
                我们配置的表现形式可以是多样的。到目前版本以支持:XML格式、Java属性文件格式或使用Spring公共API编程实现。
                但是Spring将配置元数据的读取与容器的实现封装在一个类中,总感觉是一种“耦合”,是否应该将配置元数据重新封装在另一个独立接口中呢?
                到目前为止Spring提倡的主流的配置形式仍是XML配置文件,同时Spring对这种方式也有比较完善的API支持,比如多xml的载入就有两种不同的实现方式:
                 1、            将文件路径作为字符串数组传给ApplicationContext构造器,而bean factory将通过调用bean  defintion reader从多个文件中读取bean定义。
                 2、            使用一个或多个的<import/>元素来从另外一个或多个文件加载bean定义。
1.1.2    Bean
                 这里说的Bean是指:通过配置由Spring管理的对象,Spring支持多种bean的形式。在IoC容器内部,这些bean定义由BeanDefinition 对象来表示,该定义将包含以下信息:
  Class、name、scope、constructor arguments、properties、autowiring mode、dependency checking mode、lazy-initialization mode、initialization method和destruction method
·类命名(name)
        Spring允许为Bean指定一个或者多个别名,在Bean的定义中可以同过name属性,如:<bean id="name1" name="name2,name3,name4" class="java.lang.String"/>;同时,在xml配置文件的其它部分可以通过alias标签指定已存在bean的别名,如:<alias name="componentA-dataSource" alias="componentB-dataSource"/>。
         写到这里,我想到Spring中的相关实现大概如此:这里笔者使用范型的方式将Map的结构表现出来,当然在容器中还会有Map<String, BeanDefinition>这样的Map,用来保存Bean名称和BeanDefinitiond的映射。
/** Map from alias to canonical bean name */
private final Map<String,String> aliasMap = new HashMap<String,String>();
       
·类初始化(class)
        Spring类的初始化有三种形式:用构造器来实例化、使用静态工厂方法实例化和使用实例工厂方法实例化。XML配置分别如下:
       用构造器来实例化:
<bean id="exampleBean" class="examples.ExampleBean"/>
  使用静态工厂方法实例化:
<bean id="exampleBean" class="examples.ExampleBean2" factory-method="createInstance"/>
1.1.3 容器的使用
关于容器的使用,在Spring2.0 的官方文档上是有这样一段代码:
InputStream is = new FileInputStream("beans.xml");
BeanFactory factory 
= new XmlBeanFactory(is);
我不知道是文档作者的疏忽还是我的无知,不过这段代码在2.0中编译不通过,看看XmlBeanFactory的源码:
public class XmlBeanFactory extends DefaultListableBeanFactory {

    
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);


    
/**
     * Create a new XmlBeanFactory with the given resource,
     * which must be parsable using DOM.
     * @param resource XML resource to load bean definitions from
     * @throws BeansException in case of loading or parsing errors
     
*/

    
public XmlBeanFactory(Resource resource) throws BeansException {
        
this(resource, null);
    }


    
/**
     * Create a new XmlBeanFactory with the given input stream,
     * which must be parsable using DOM.
     * @param resource XML resource to load bean definitions from
     * @param parentBeanFactory parent bean factory
     * @throws BeansException in case of loading or parsing errors
     
*/

    
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        
this.reader.loadBeanDefinitions(resource);
    }


}
没有XmlBeanFactory(InputStream is);这样的构造子啊,不知为什么,呵呵。后来我用下面的代码来实现:
Resource resource = new FileSystemResource("applicationContext.xml");
BeanFactory factory 
= new XmlBeanFactory(resource);
写到这里IoC容器和Bean的原理就介绍完了,下一次介绍“依赖”。
使用实例工厂方法实例化:
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="myFactoryBean" class="...">
  ...
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
      factory
-bean="myFactoryBean"
      factory
-method="createInstance"/>
               同时Spring IoCBean功能也和这些信息对应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值