Spring两大核心功能,IOC(Inverse  of  Control)  和 AOP(Aspect-Oriented-Programming)

IOC原理模拟:

  有这样一个beans.xml:

 <beans>
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" />
<bean id="userService" class="com.bjsxt.service.UserService" >
<property name="userDAO" ref="u"/>
</bean> </beans>

现在我们想读取这个配置文件,实例化里面所有的bean,将其放到我们的容器中

1. 首先我们的容器是一个 Map,里面存放我们bean的实力对象

private Map<String,Object> beans = new HashMap<String,Object>();

2.开始解析这个配置文件

  a)读取这个配置文件,先获取这个配置文件的根节点,再获取根节点下所有标签名为 <bean> 的节点

 Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象
Element root = doc.getRootElement(); //获取根元素
List list = root.getChildren("bean"); //获得根节点下所有标签名为 bean 的节点

  b)遍历所有的<bean>节点,拿到里面的 id 属性和 class属性

for(int i=0;i<list.size();i++) {
Element element=(Element)list.get(i);
String id=element.getAttributeValue("id");
String clazz=element.getAttributeValue("class");

  

  c)根据每个bean中的class属性的值,创建这个类的一个实例,将这个实例对象作为 value,bean中的id属性作为 key ,put进我们的容器中

Object o = Class.forName(clazz).newInstance();
beans.put(id, o); //key 为 id 属性,value为 class 属性的实例

  d)遍历所有的<bean>节点,判断 <bean> 节点后面是否还有 <property>节点

   如果有的话,说明 这个bean中还需要注入其他实例对象 作为 属性 注入给它,所以我们需要继续去读这个 <property>,拿到 <property> 的 name 属性 和 ref属性

for(Element propertyElement : (List<Element>)element.getChildren("property")) {            //如果某个bean中,存在property,即 存在 set***方法,则将xml文件指定的class注入进行
String name = propertyElement.getAttributeValue("name"); //userDAO
String ref= propertyElement.getAttributeValue("ref"); //u

  e)ref关联的是 某个 bean的id,所以通过ref属性,就可以 get 出 对应的实例对象,用于注入

 Object beanObject = beans.get(ref);                 //UserDAOImpl instance

  

  f)既然某个bean 希望 有 另外一个bean 可以注入进来,那么肯定要有对应 set方法,这个时候就需要用到 name 属性

  通过name属性,得到 注入的位置,如这里 name属性的值是 userDAO,说明该bean 需要一个UserDAO 类型的属性

  通过字符串拼接得到 setUserDAO方法,

String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);        //拼接成setUserDAO

  

  g)反射调用该方法,完成 bean 的注入

Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);   //反射调用 setUserDAO 方法,将userDao 注入 到 userService中
m.invoke(o, beanObject);

  h)外界调用

  当程序一启动,就启动我们的容器,读取配置文件,完成bean 初始化和 注入,放到我们容器中

  UserService service = (UserService) applicationContext.getBean("userService");

  getBean方法,实际上就是 调用我们 容器(Map)的 get方法,通过 bean节点的id属性,拿到对象bean的实例

1.IOC原理模拟的更多相关文章

  1. Java反射机制及IoC原理

    一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通 ...

  2. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  3. IOC原理分析

    IOC(inversion of control)控制反转 在我们的程序中,要实现某个功能,我们都会用到两个或两个以上的类来协同完成,那么在一个类中,我们就会要有它的合作类的引用,也就是说这个类依赖于 ...

  4. Spring的IOC原理[通俗解释一下]

    Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...

  5. spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...

  6. Spring之IOC原理及代码详解

    一.什么是IOC 引用 Spring 官方原文:This chapter covers the Spring Framework implementation of the Inversion of ...

  7. 【SpringBoot】 理解Spirng中的IOC原理

    前言 前文已经介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念就是: IOC容器 大家也知道IOC是Sping 的重要核心之一,那么如何理解它呢,它又是产生什么作用呢?本文就IOC ...

  8. Spring IOC原理补充(循环依赖、Bean作用域等)

    文章目录 前言 正文 循环依赖 什么是循环依赖? Spring是如何解决循环依赖的? 作用域实现原理以及如何自定义作用域 作用域实现原理 自定义Scope BeanPostProcessor的执行时机 ...

  9. Spring IOC 原理深层解析

    1 Spring IOC概念认识 1.1 区别IOC与DI 首先我们要知道IOC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spri ...

随机推荐

  1. Centos D-Bus connection: Operation not permitted

    解决办法: 首先要先在后台启动一个 CentOS7 容器(注意不要少参数): docker run -d -e "container=docker" --privileged=tr ...

  2. pip安装pillow——死循环:[WinError5] & [TypeError:'module' object is not callable]

    1.这次本来要安装个pillow,记得以前装了的,怎么这次就不行了.然后,下意识的使用:pip3 install pillow. 发现报错: [TypeError:'module' object is ...

  3. ThreadingTCPServer源码解析

    实例 #!/usr/bin/env python #-*- coding:utf-8 -*- import SocketServer class Myserver(SocketServer.BaseR ...

  4. http与https的主要区别

    HTTP与HTTPS的主要区别如下: 1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用. 2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输 ...

  5. VC程序运行时间测试函数

    VC程序运行时间测试函数 介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如 ...

  6. 【DSP开发技术】影响高性能DSP功耗的因素及其优化方法

    影响高性能DSP功耗的因素及其优化方法 德州仪器DSP技术应用工程师 冯华亮 摘要 本文讨论影响高性能DSP功耗的因素,介绍一些DSP功耗的优化方法. 随着嵌入式应用需求的不断提高,DSP的速度也不断 ...

  7. 连接池和JDBCTemplate

    一:什么是连接池?使用连接池的好处是什么? 连接池就是一个存放数据库连接对象的容器.当系统初始化后,就会向数据库申请一些连接对象存放到容器里,用的时候直接从容器里取,用完后放回连接池. 连接池可以提高 ...

  8. WEB渗透技术之浅析路径遍历

    1. 发送 http://www.nuanyue.com/getfile=image.jgp 当服务器处理传送过来的image.jpg文件名后,Web应用程序即会自动添加完整路径,形如“d://sit ...

  9. Spring mybatis源码篇章-动态SQL基础语法以及原理

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis的XML文件加载 前话 前文通过Spring中配置mapperLocations属性来进行对m ...

  10. BridgeOverARoughRiver(POJ-3404)【AdHoc】

    题目链接:https://vjudge.net/problem/POJ-3404 题意:n个极限速度不同的人要过桥,一开始所有人在桥的一边,每次最多两个人同时过桥,过桥时需要用一把火炬并且全场只有一把 ...