什么是SpringIOC
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
交由Spring来管理这些,实现解耦
SpringIOC原理
使用反射机制+XML技术
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 把对象初始化之后,存在HashMap里面去 放到内存里面去,JVM内存里面去之后,别人只要调用getBean方法之后,去Spring的容器里面去找到一个对象就行了这种方式也可以,这种方式我待会再讲,再讲注解的时候我会去实现,所以我是把两种方式都会实现的,待会我讲注解方式的时候会详细讲的,在Spring中id如果重复的情况下是会报错的,所以有的时候是需要做校验的,找最后默认的也可以,这个看你自己怎么实现,--><bean id="user" class="com.learn.spring.entity.User"></bean></beans>
package com.learn.spring.entity;public class User {private Integer id;private String userName;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}
package com.learn.spring;import java.io.InputStream;
import java.util.List;import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/*** 我们先定义这个类* 我会将两种方式的实现方式* 我们建完ClassPathXmlApplicationContext这个类* 自定义Spring容器框架* xml方式实现* 你们在写代码之前* 不要盲目的去写* 先通过白话文* 他不知道思路* 你先通过白话文知道整个实现过程* 那这个我们怎么实现呢* * * @author Leon.Sun**/
public class ClassPathXmlApplicationContext {// xml路径地址/*** xml读取路径地址* */private String xmlPath;/*** 定义一个构造函数* 传入xmlPath* * * @param xmlPath*/public ClassPathXmlApplicationContext(String xmlPath) {this.xmlPath = xmlPath;}/*** 这里要传入一个bean的id过来* 返回的是一个Object对象* 这个方法也返回Object对象* * * @param beanId* @return* @throws Exception*/public Object getBean(String beanId) throws Exception {// 1. 读取配置文件/*** 解析XML文件* 如果不解析* 我怎么去读取这个bean* 是不是这样的* 这肯定要解析* 解析是第一步* 第一步是把XML文件解析一遍* */List<Element> elements = readerXml();/*** 还有一种场景就是我没有配置任何bean* 代码根本就不用往下面再走了* 是不是这样的* 我们是不是可以直接判断一下* */if (elements == null) {throw new Exception("该配置文件没有子元素");}// 2. 使用beanId查找对应的class地址/*** 我把xml全部解析了之后* 第二步干嘛* 使用方法参数bean id查找配置文件中bean节点的id信息是否一致* 假设我这个时候传入userService* 这样的一个beanid* 查找到了就要获取他的class地址* 是不是这样的* 然后方法里面传入一个参数过来userService* 我能不能找到userService的一个节点* 是不是找到这个节点* * */String beanClass = findXmlByIDClass(elements, beanId);if (StringUtils.isEmpty(beanClass)) {throw new Exception("未找到对应的class地址");}// 3. 使用反射机制初始化,对象/*** 获取class信息地址* 使用反射机制初始化* * 找到class信息* 拿到信息之后我使用JAVA的反射机制* 初始化之后返回给调用者* 这里有多少个实现方式* * */Class<?> forName = Class.forName(beanClass);return forName.newInstance();}// 读取配置文件信息/*** 表示解析这样的一个XML* 这个传入的可以没有* 因为它直接拿全局的* 这个大家一定要慢慢的去想* 这个讲的非常细* * 解析XML文件信息* 拿到每个节点的信息* 拿到每个文件信息以后* 传入一个bean的ID去里面去找* 进行反射去实现出来* 你们可以先把这些节点信息给他封装起来* 怎么封装呢* * * @return* @throws DocumentException*/public List<Element> readerXml() throws DocumentException {SAXReader saxReader = new SAXReader();if (StringUtils.isEmpty(xmlPath)) {new Exception("xml路径为空...");}Document read = saxReader.read(getClassXmlInputStream(xmlPath));// 获取根节点信息/*** 读取他的根节点* */Element rootElement = read.getRootElement();// 获取子节点/*** 获取根节点下的所有的子节点* 获取这样的一个子节点之后* 获取项目下的所有的子节点* 获取所有子节点element的对象* 获取完了之后我们再怎么进行实现呢* 这个时候我可以拿到所有的bean的节点* */List<Element> elements = rootElement.elements();/*** 就是判断是否为空* */if (elements == null || elements.isEmpty()) {return null;}return elements;}// 使用beanid查找该Class地址/*** 是用beanid去查找有没有这样的class地址* 我们是不是要调用根节点* * * * @param elements* @param beanId* @return* @throws Exception*/public String findXmlByIDClass(List<Element> elements, String beanId) throws Exception {for (Element element : elements) {// 读取节点上是否有value/*** 获取属性的信息* 这个id就表示当前的userService* * */String beanIdValue = element.attributeValue("id");/*** 如果xml的id等于空的情况下* 就结束当前循环* 你如果使用Spring的时候* 会校验的* 这个具体看你们自己* */if (beanIdValue == null) {throw new Exception("使用该beanId为查找到元素");}if (!beanIdValue.equals(beanId)) {/*** 结束本次循环* */continue;}// 获取Class地址属性/*** 拿到这样的一个class地址* 拿到之后* 然后用反射去做一个初始化过程* */String classPath = element.attributeValue("class");/*** 如果等于null的情况下它会怎么样* */if (!StringUtils.isEmpty(classPath)) {return classPath;}}return null;}// 读取xml配置文件/*** 获取当前上下文路径* * @param xmlPath* @return*/public InputStream getClassXmlInputStream(String xmlPath) {InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(xmlPath);return resourceAsStream;}}
package com.learn.spring;import com.learn.spring.entity.User;public class Test002 {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User user = (User) applicationContext.getBean("user");System.out.println(user);}}

手写springiocxml方式注入对象相关推荐

  1. 手写springioc注解注入对象基本实现

    还是要养成写注释的习惯,首先一个代码想让人家看懂的情况下,记住一点,重构加设计模式,其实设计模式也比较好,达到别人可易读性,这是我要跟你讲的,而且你们不写注释是一个不好的习惯,你们一定要养成我善于重构 ...

  2. springiocxml方式注入对象原理分析

    尤其是注解版本,都看懂了没有,你们最好都建立maven工程,不要建单独的java项目,这个项目建好了之后说一下,直接把pom文件copy过来,pom文件里面不是有依赖信息吗,你们都不要去写了,写比较浪 ...

  3. 【uni-app】使用写字板,实现手写签名----直接使用版

    需求 用户需在APP或小程序使用手写的方式签字或签名 效果图片 实现方式 封装成组件调用(推荐),如需了解使用可点击前往-[封装组件版] 使用的页面内直接使用,目前的教程就是直接使用的,未封装成组件 ...

  4. penpower手写

    http://www.penpower.com.cn/technology-handwriting.asp 手写辨识技术应用于桌上型.笔记型电脑愈来愈普及化,随着手机.PDA等行动装置的蓬勃发展与特殊 ...

  5. xpath获取标签的属性值_[Selenium]12.加餐: 如何手写xpath

    场景 使用Selenium进行自动化测试,一大难题就是元素定位.虽然Selenium支持使用ID.name.Class.链接文字等多种方式进行元素识别,但对于复杂的网页,采用富客户端框架的前台界面,部 ...

  6. 基于摄像头实现手写输入字符功能(视频手写)

    当前市场上的PC摄像头,尽管生产厂家在外观上费尽心思,以求获得顾客亲睐,但中国的摄像头生产厂商太多,产品外观大同小异,同化现象严重,任何一个厂家已经不能仅凭精美的外观设计手段去提高市场份额了.PC摄像 ...

  7. 如何在PDF文档中添加手写签名?

    有时为了给PDF文档增加安全性或一些场合需求,要给PDF文档的内容添加上自己的手写签名,应该使用什么工具呢?要怎么操作呢? 1.制作电子版手写签名 方式1:打开电脑的画图工具,使用鼠标画出签名并设置好 ...

  8. 手写识别ocr java,怎么识别手写文字?迅捷OCR文字识别软件帮你快速完成!

    怎么识别手写文字?虽然现在手机.平板等设备已经普及开来,但是从小在学校养成的习惯,还是让大部分人选择会手写的方式.手写其实也有很大的缺陷,无论是在生活中还是在网络上进行分享都比较困难. 那么有没有将手 ...

  9. 现在论文用手写还是用计算机写,调查显示近半人基本全用电脑写字 八成受访者提笔忘字...

    电脑已经成为大多数人的写字工具.(资料图片) 大部分现代人,只有在签名的时候才会拿起笔.(资料图片) "罄竹难书"."鳞次栉比"."沆瀣一气" ...

最新文章

  1. 使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with
  2. chrome插件下载
  3. 临床科研设计的主要内容
  4. flex将元素放在最后_前端布局——Flex弹性布局
  5. 至今还记忆犹新的即时通讯
  6. Springmvc 返回html视图解决
  7. 城市动能转换_地理答啦:高速公路过境,省道国道穿城——济南北跨,建设新旧动能转换先行区应当关注的问题...
  8. Redis 常见的性能问题和解决方法
  9. java根据模板生成word文档_Python办公自动化:使用python来自动生成word文档
  10. Oracle→序列、视图、索引、存储过程、存储函数、包、触发器、表分区、锁表解锁表、事务、PLSQL、备份恢复、游标
  11. 如何使用CleanMyMac彻底擦除文件?
  12. php怎么文字加粗体代码,css怎么实现字体描边效果,html字体加粗加黑代码
  13. 中国计划建设自己的卫星导航系统
  14. 【CSON原创】javascript图片滚动效果发布
  15. 巴宝莉(Burberry)换等线体LOGO了!
  16. matlab 各类符号意义
  17. word自带公式批量转成MythType格式的采坑小记
  18. 如何利用python计算即期利率_即期利率的定义_即期利率的计算公式_即期利率和远期利率...
  19. 当我们在谈论HTTP队头阻塞时,我们在谈论什么?
  20. 关于图片存储格式的整理(BMP)

热门文章

  1. Linux 安装Redis全过程日志
  2. 堆排序 海量数据求前N大的值
  3. 容器内存释放问题(STL新手笔记)
  4. MY MOBILER v1.23 - 类似SOTI Pocket Controller的免费工具
  5. REST面向资源架构 RESTful架构
  6. 《Scala机器学习》一一3.3 应用
  7. 修复cocos2dx的Label,WP8下不能换行的问题
  8. 监控系统安装配置文档(Nagios+Cacti+Nconf)
  9. NumPy 百题大冲关,冲鸭!
  10. 有哪些好用不火的软件?