1.IOC原理模拟
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原理模拟的更多相关文章
- Java反射机制及IoC原理
一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通 ...
- 【Spring】Spring IOC原理及源码解析之scope=request、session
一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...
- IOC原理分析
IOC(inversion of control)控制反转 在我们的程序中,要实现某个功能,我们都会用到两个或两个以上的类来协同完成,那么在一个类中,我们就会要有它的合作类的引用,也就是说这个类依赖于 ...
- Spring的IOC原理[通俗解释一下]
Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...
- spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例
下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...
- Spring之IOC原理及代码详解
一.什么是IOC 引用 Spring 官方原文:This chapter covers the Spring Framework implementation of the Inversion of ...
- 【SpringBoot】 理解Spirng中的IOC原理
前言 前文已经介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念就是: IOC容器 大家也知道IOC是Sping 的重要核心之一,那么如何理解它呢,它又是产生什么作用呢?本文就IOC ...
- Spring IOC原理补充(循环依赖、Bean作用域等)
文章目录 前言 正文 循环依赖 什么是循环依赖? Spring是如何解决循环依赖的? 作用域实现原理以及如何自定义作用域 作用域实现原理 自定义Scope BeanPostProcessor的执行时机 ...
- Spring IOC 原理深层解析
1 Spring IOC概念认识 1.1 区别IOC与DI 首先我们要知道IOC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spri ...
随机推荐
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_01-vuejs研究-vuejs介绍
1.vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计 为可以自底向上逐层应用.Vue 的核心库只关注视 ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_01-自定义查询页面-服务端-Dao
在页面输入查询条件,查询符合条件的页面信息. 查询条件如下: 站点Id:精确匹配 模板Id:精确匹配 页面别名:模糊匹配 spring mongoDB如何自定义条件 在Repository的findA ...
- Qt编写安防视频监控系统2-视频播放
一.前言 视频播放功能是核心功能之一,为了统一管理接口,统一封装成一个控件,对外提供seturl open close方法即可,不用去管内部的具体处理,这样就可以提供多种接口来实现统一的管理,比如vl ...
- Python查询Mysql时返回字典结构的代码
Python查询Mysql时返回字典结构的代码 MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.D ...
- 【作品集】UX作品集
https://www.uisdc.com/10-inspiring-ux-portfolios http://jeya.io http://antonmircea.com/FinalUX.pdf h ...
- 撸一个vue的双向绑定
1.前言 说起双向绑定可能大家都会说:Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更 ...
- 图像欧拉数计算 matlab实现
EUL = C - H 其中EUL表示欧拉数 C表示对象数 H表示孔洞数 欧拉数常用来识别数字: 识别数字 8 ,8 的欧拉数为 -1 ,不同于0,1,2,3,4,5,6,7,9 close all ...
- shell学习笔记1-文件安全与权限
1,创建文件的用户和他所属的组拥有该文件,文件的属主可以设定谁具有读.写.执行该文件的权限,根用户可以改变任何普通用户的设置. 2,一个文件一经创建,就具有三种访问权限:读(可以显示该文件的内容).写 ...
- 【VS开发】内存映射文件进程间共享内存
内存映射文件进程间共享内存 内存映射文件的另一个功能是在进程间共享数据,它提供了不同进程共享内存的一个有效且简单的方法.后面的许多例子都要用到共享内存.共享内存主要是通过映射机制实现的.Windows ...
- STM32 MCU一次计算优化和提速
1.背景 STM32 MCU对25.6Kb数据进行压缩,丢掉每个数据的低4位然后2个字节拼接为1个字节.发现处理耗时竞达1ms以上,于是开始进行优化,最后达到200us的效果,提速5倍以上. 2.优化 ...