Spring入门---Spring框架底层原理

面试问题相关---http://blog.csdn.net/guolin6315/article/details/6732993点击打开链接

Spring可以维护各个bean(对象),并向其中注入属性值。那么,如果要把一个对象的引用注入另一个对象

呢?应该怎么处理呢?

对于对象中的属性来说,我们注入属性的方式为:在配置文件中使用property标签。

  <property name="对象属性名称" >
          <value>要注入的内容</value>
  </property>
     那么如果我们的类中有对另一个对象的引用呢?这个时候,其实类似于注入一个属性,只是需要使用ref标签进行注入:首先我们需要通过bean配置两个类,我们分别给他们的id命名为:类1、类2。这时假如我们的需求是类1中包含有对类2的引用。也就是说,类2是类1的一个属性。这时我们就需要将类2的对象注入到类1对象中。配置文件中的写法如下:
 	<bean id= "类1" class="类1的全路径">
       <!--这里的注入方法类似于上面的value注入,可以写在一行也可以多行-->
        <property name="类2在类1中的属性名" ref="类2">
</bean>
    <!--这里的类2是对象名称,再注入的时候ref中的值必须和bean 后面的Id完全一致-->
<bean id="类2" class="类2的全路径">
</bean>
	以上的做法是我们的spring管理各个对象和维护各个对象之间的关系。其中具体的执行原理是:
	当ClassPathXmlApplicationContext("applicationContext.xml")这句话执行的时候,Spring
容器对象就创建。这个对象会读取applicationContext.xml中配置的bean就会被创建,并且放入内存。
具体是依赖于我们的反射机制。
    就拿上面代码说:首先类1被创建,创建后,假设这个对象内存中的地址为:

123对象中对于对象二的引用为(???)。此时的内存如下:

    

然后类2被创建,这时候,类2在对象中的内存地址会赋值给类1中相应字段的引用。具体来说:假设类2的地址为:456这时123对象中的那个对于

对象2的引用由(???)改为(456)完成类的依赖注入。此时内存如下:

    

其实,这些对象都存在与applicationContext对象的一个类似于HashMap的引用中。这也是我们为什么要将applicationContext对象设置为单例的原因。

    那么,spring是如何实现刚才的那些个调用呢?首先,通过dom4j将我们的配置文件读取,这时我们就可以解析到所有相关的类的全路径了。

然后,它再利用反射机制通过如下代码完成类的实例化:类1=Class.forName("类1的全路径")。这时,我们就得到了类1。(这也是为啥当我们的类的

全路径写错了会导致出现classNotfind的错误。)

    当我们得到了类1以后,通过调用类1的set方法,将属性给对象进行注入。而且,需要遵循首字母大写的set规范。例如:我们的类中有个字

段的属性为name那么set方法必须写成setName(name 的首字母要大写)否则会报一个属性找不到的错误:

1   public void setName(String name){ 
2              this.name= name; 
3   } 

  对象创建后,我们将我们的对象id和我们的对象物理地址,一起存入类似于HashMap的容器中,然后呢,我们是如何获得我们需要的对象,然后

执行对象中的方法呢?我们通过getBean的方法,通过对象Id获得对象的物理地址,得到对象,然后调用对象的方法,完成对方法的调用。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值