上一篇的博客,我们可以看出来,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 的首字母要大写)否则会报一个属性找不到的错误:

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

  对象创建后,我们将我们的对象id和我们的对象物理地址,一起存入类似于HashMap的容器中,然后呢,我们是如何获得我们需要的对象,然后执行对象中的方法呢?我们通过getBean的方法,通过对象Id获得对象的物理地址,得到对象,然后调用对象的方法,完成对方法的调用。

spring入门--Spring框架底层原理的更多相关文章

  1. spring入门--spring入门案例

    spring是一个框架,这个框架可以干很多很多的事情.感觉特别吊.但是,对于初学者来说,很难理解spring到底是干什么的.我刚开始的时候也不懂,后来就跟着敲,在后来虽然懂了,但是依然说不明白它到底是 ...

  2. 深入理解 Spring Cloud 核心组件与底层原理

    一.Spring Cloud核心组件:Eureka Netflix Eureka Eureka详解 1.服务提供者 2.服务消费者 3.服务注册中心 二.Spring Cloud核心组件:Ribbon ...

  3. spring入门案例分析及原理

    Springmvc执行原理: 一. 入门案例的执行流程 1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载s ...

  4. spring获取jdbc链接底层原理

    获取连接池的连接二种逻辑 1.一个事务中,一个连接 (底层逻辑:threadlocal存储  里面是map: key是数据源,value:链接) map存储应该是为多数据源使用的2.没有事务的serv ...

  5. 深入理解List集合框架底层原理的实现

    前言: 此篇文章讲解ArrayList和LinkedList底层实现原理.for和foreach遍历集合哪个效率会更高一些! 讲讲什么是集合框架?集合框架是为表示和操作集合而规定的一种统一的标准的体系 ...

  6. Spring入门及IoC的概念

    Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...

  7. 《React Native 精解与实战》书籍连载「React Native 底层原理」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  8. spring框架的IOC的底层原理

    1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...

  9. 拜托!面试请不要再问我Spring Cloud底层原理

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...

随机推荐

  1. PHP文件上传安全处理的步骤

    正确步骤:1.读取文件名,验证扩展名是不是在范围内 2.自己定义生成的文件名,目录,扩展名可以来自文件名扩展名. 其它值,都自己配置,不读取上存中内容 3.将文件 移到新目录(这个目录权限设置只读) ...

  2. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  3. Sublime Text 快捷键--持续更新

    快捷键 功能 说明 ctrl+D 选取一个单词连续按组合键会选择页面所有相同的这个单词   ctrl+Z 撤销上一个操作   ctrl+Y 恢复上一个操作   ctrl+shift+F 底部打开搜索全 ...

  4. 【java基础】内部类,局部内部类,匿名内部类、静态内部类、接口中的内部类

    内部类: 1.定义在一个类中的内部类,内部类的实例化伴随着外围类所定义的方法来构造,内部类对象有外围类的隐式引用,所以内部类可以直接访问外围类的外围类的域,包括私有的,这是内部类的访问特权,所以比常规 ...

  5. UVa 483 - Word Scramble

    题目大意:给一个由单词组成的句子,只反转单词内部的次序而不改变单词之间的次序.如“I love you.”转换成“I evol .uoy”. #include <cstdio> #incl ...

  6. handler的使用

    2014-04-15 10:45:06 简单学习了handler的使用. 昨天下载的问题,在手机上正常,在平板上不正常. 怀疑是网络的问题. 一直获得的流为空 2014-04-15 18:10:59 ...

  7. Nodejs之发送邮件nodemailer

    nodejs邮件模块nodemailer的使用说明 1.介绍 nodemailer是node的一个发送邮件的组件,其功能相当强大,普通邮件,传送附件,邮件加密等等都能实现,而且操作也十分方便. nod ...

  8. YII 1.0 上传文件

    $upload = CUploadedFile::getInstance($articleModel,'thumb'); if($upload){ $name = date("Ymd&quo ...

  9. 一个简单版的波纹css3动画

    ul{width: 300px;border: red;}ul li{width: 300px;height: 70px;line-height: 70px;background: #fff;text ...

  10. WEB 开发者应该具备的 6 大技能?

    1. 界面和用户体验 注意,浏览器的实现标准是不一致的,请确保你的网站能够兼容所有主流的浏览器.最少需要测试的有 Gecko 引擎 (Firefox),WebKit引擎(Safari以及一些手机浏览器 ...