1.IOC原理模拟

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

IOC原理模拟:

  有这样一个beans.xml:

1 <beans>
2     <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" />
3     <bean id="userService" class="com.bjsxt.service.UserService" >
4         <property name="userDAO" ref="u"/>
5     </bean>
6
7 </beans>

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

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

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

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

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

1 Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象
2         Element root = doc.getRootElement();            //获取根元素
3         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的实例

时间: 2024-08-27 03:08:22

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

厨师版Ioc及Ioc的模拟实现

  关于IOC:我们讲个故事吧! 有一个厨师,他在做一道菜的时候需要某种调味料(bean),可是他正好没有那瓶调味料(bean),这个时候他就必须去制作一瓶调味料(bean)出来.(这就像我们平时需要对象的时候一样:UserDao  userdao=new UserDaoImpl)这个时候厨师的工作就不得不跟制作调味料联系起来,这就是所谓的"耦合".(耦合程度高通说来说就是,我没了你我活不了了.); 这个时候IOC里的控制反转出来了,它提出,开辟一个仓库(容器),里面放着各种各样的调味

好程序员Java干货分享Spring框架之IOC原理

好程序员Java干货分享Spring框架之IOC原理,前言:Spring框架是我们进行企业级开发的最常用框架,本章我们将了解Spring框架,并学习Spring的IOC特性以及IOC的实现原理:注解和反射. Spring框架简介 Spring是一种轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架,能够为企业级开发提供一站式服务. Spring的优点有 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度

Java反射机制及IoC原理

一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字. 二. 反射机制的作用 在运行时判断任意

Spring IOC原理(初级版)

Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦合性的角度而言,绝大部分Java应用都可以从Spring中受益. ------------------------------------------------------------↑ 以上都是废话,我也不懂 ↑   ↓ 下面是整体架构,可以略过 ↓ ----------------------

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

一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存放什么东西的意思,但是放在程序猿的世界,却注定是千差万别.Collection,集合,存放obj instanceof Class为true的一类对象,重点在于存放:Container,容器,可以存放各种各样的obj,但不仅仅是存放,他被称为容器,更重要的是他能管理存放对象的生命周期和依赖. 容器:

Spring——IoC原理

一.概念 IoC是Inversion of Control的缩写,有的翻译成"控制反转",还有翻译为"控制反向"或者"控制倒置". 二.什么是IoC IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式.在Spring中控制反转是Spring框架的核心,其原理是基于OO设计原则的:Don't call us,we'll call you(别来找我,我会来找你的).也就是说,所有组件都是被动的,所有的组件初始化和调用都由容器负责.组件处在一

IOC原理分析

IOC(inversion of control)控制反转 在我们的程序中,要实现某个功能,我们都会用到两个或两个以上的类来协同完成,那么在一个类中,我们就会要有它的合作类的引用,也就是说这个类依赖于别的类,这个合作类的获取,将会有一下几种不同的情况 依赖获取的三种方式: Java代码 情况1.自己生成 Class person{ Eat(){ Apple a=new Apple(); } } 第一种方式:在person的eat()方法里就把吃的水果写死,从开始就创建对象, 缺点 :1.Pers

Java反射及 IoC原理、内省机制

JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性. 1.2 反射机制的作用 在运行时判断任

【SpringBoot】 理解Spirng中的IOC原理

前言 前文已经介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念就是: IOC容器 大家也知道IOC是Sping 的重要核心之一,那么如何理解它呢,它又是产生什么作用呢?本文就IOC原理进行简要阐述. IOC定义 IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入. DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的