什么是SpringIOC

什么是SpringIOC,就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理。

什么是SpringIOC底层实现原理

1.读取bean的XML配置文件

2.使用beanId查找bean配置,并获取配置文件中class地址。

3.使用Java反射技术实例化对象

4.获取属性配置,使用反射技术进行赋值。

详细步骤

1.利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象
2.对于Document对象获取根元素对象<beans>后对下面的<bean>标签进行遍历,判断是否有符合的id.
3.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射
建立对象.
4.遍历<bean>标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml
配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.
5.如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应
的对象,再给属性赋值.
6.返回建立的对象,如果没有对应的id,或者<beans>下没有子标签都会返回null
<?xml version="1.0" encoding="UTF-8"?>
<beans><bean id="user1" class="com.learn.entity.UserEntity"><property name="userId" value="0001"></property><property name="userName" value="leon"></property></bean><bean id="user2" class="com.learn.entity.UserEntity"><property name="userId" value="0002"></property><property name="userName" value="张三"></property></bean>
</beans>
package com.learn.entity;public class UserEntity {private String userId;private String userName;public UserEntity(){System.out.println("无参构造函数....");}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}
package com.learn.service;import java.lang.reflect.Field;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import com.learn.entity.UserEntity;public class ClassPathXmlApplicationContext {private String xmlPath;public ClassPathXmlApplicationContext(String xmlPath) {this.xmlPath = xmlPath;}public Object getBean(String beanId) throws DocumentException, ClassNotFoundException, NoSuchFieldException,SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException {// spring 加载过程 或者spring ioc实现原理// 1.读取xml配置文件// 获取xml解析器SAXReader saxReader = new SAXReader();// this.getClass().getClassLoader().getResourceAsStream("xmlPath")// 获取当前项目路径Document read = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));// 获取跟节点对象Element rootElement = read.getRootElement();List<Element> elements = rootElement.elements();Object obj = null;for (Element sonEle : elements) {// 2.获取到每个bean配置 获取class地址String sonBeanId = sonEle.attributeValue("id");if (!beanId.equals(sonBeanId)) {continue;}String beanClassPath = sonEle.attributeValue("class");// 3.拿到class地址 进行反射实例化对象 ,使用反射api 为私有属性赋值Class<?> forName = Class.forName(beanClassPath);obj = forName.newInstance();// 拿到成员属性List<Element> sonSoneleme = sonEle.elements();for (Element element : sonSoneleme) {String name = element.attributeValue("name");String value = element.attributeValue("value");// 使用反射api 为私有属性赋值Field declaredField = forName.getDeclaredField(name);// 允许往私有成员赋值declaredField.setAccessible(true);declaredField.set(obj, value);}}// 3.拿到class地址 进行反射实例化对象 ,使用反射api 为私有属性赋值return obj;}public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,IllegalArgumentException, IllegalAccessException, InstantiationException, DocumentException {ClassPathXmlApplicationContext appLication = new ClassPathXmlApplicationContext("user.xml");Object bean = appLication.getBean("user1");UserEntity user = (UserEntity) bean;System.out.println(user.getUserId() + "----" + user.getUserName());}}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="    http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/tx     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd    http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsd"><bean id="user1" class="com.learn.entity.UserEntity"><property name="userId" value="0002"></property><property name="userName" value="张三"></property></bean><bean id="user2" class="com.learn.entity.UserEntity"><property name="userId" value="0002"></property><property name="userName" value="张三"></property></bean></beans>   
package com.learn.service;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.entity.UserEntity;@SuppressWarnings("resource")
public class Main {public static void main(String[] args) {// 1.读取springxml配置ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 2.获取bean对象UserEntity userEntity = (UserEntity) classPathXmlApplicationContext.getBean("user1");System.out.println(userEntity.getUserId()+"----"+userEntity.getUserName());}}

SpringIOC概述相关推荐

  1. 蚂蚁课堂(每特学院)-2期

    蚂蚁课堂2期视频公开-请大家多多支持蚂蚁课堂 密码: tt53 0001-蚂蚁课堂(每特学院)-2期-多线程快速入门 第01节.线程与进程的区别 第02节.为什么要用到多线程 第03节.多线程应用场景 ...

  2. SSM三大框架从0到1,无障碍学习,萌新可入《一》

    框架概述 1.框架的概念 所谓的框架其实就是程序的架子. 把web开发中和业务无关的重复部分提取成通用的程序的架子,就是框架. 2.javaweb开发中的框架SSH 老三大框架:SSH Struts2 ...

  3. Java开发面经分享:SpringIOC中复杂属性如何“巧妙

    private Map<String, Object> maps;private Properties properties; } 下面我们将依次讲解如何给赋值属性赋值.**1.为类属性赋 ...

  4. Spring-Spring配置概述

    Spring容器高层视图 成功启动Spring容器的三个必要条件 Bean配置信息 基于XML的配置 Schema的配置格式 Bean的基本配置 装载一个Bean Bean的命名 总结 导读 Spri ...

  5. (SpringMVC)概述和简单使用

    文章目录 1. 什么是SpringMVC 1.1 概述 1.2 中心控制器 1.3 SpringMVC执行原理 2. 简单使用 2.1 配置版 2.2 注解版 3. 总结 1. 什么是SpringMV ...

  6. SpringIOC容器介绍

    IOC & DI 概述 配置 bean 配置形式:基于 XML 文件的方式:基于注解的方式 Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).F ...

  7. SpringIOC容器-对象依赖

    1 概述 Spring中,如何给对象的属性赋值?  [DI, 依赖注入] 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4) 自动装配 5) 注解 1.1 通过构造函数 &l ...

  8. spring基础概述

    1.Spring概述Spring是分层的java SE/EE应用 full-stack 轻量级开源框架,以IOC(Inverse of control)翻转控制和AOP(Aspect Oriented ...

  9. Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用

    1. Spring Boot概述 Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 首页Spring Boot简介可以 ...

最新文章

  1. POJ3268 Silver Cow Party(最短路径)
  2. java int.parse_java数据类型转换,parseXXX(String)或valueOf(String)有什么区别?
  3. mac支持NVDANV顯卡型號持列表
  4. 使用 JavaScript 进行 Base64 编码与解码
  5. VC++打开、保存文件对话框和浏览文件夹对话框
  6. 英国法院裁定GCHQ黑客发动网络攻击并不侵犯人权
  7. Picocli 2.0:事半功倍
  8. 在vc++里面进行图像处理的时候应该把图形放哪_图形找朋友小班教案
  9. Facebook 有序队列服务设计原理和高性能浅析
  10. php-5.6 安装部署整理
  11. 权限管理框架之Shiro
  12. 联想智能云教室安win7_用“联想智能云教室”部署系统完成后,操作卡顿?
  13. 计算机硬盘的内存单位换算,内存的单位换算
  14. 计算机三级网络技术知识点大全(九)
  15. pgsql 日期转换
  16. 莫古力最新服务器,《最终幻想14》将调整现有人口平均化策略
  17. win10家庭版如何安装Windows Sandbox
  18. getTime()得到时间戳不一样
  19. 学籍管理系统java_学籍管理系统(Java初级版)
  20. syntax error, expect [, actual {, pos 0, fieldName null解决方法

热门文章

  1. 【struts2】struts2的零配置
  2. rtti获取类的字段和属性和方法
  3. 优化PHP程序的方法(温故知新)
  4. Hibernate随机获取指定范围内的指定条目的记录
  5. 会场安排问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=14
  6. JSP、Servlet、Tomcat、JDK、J2EE版本比较
  7. 零基础入门 HTML 的 8 分钟极简教程
  8. 一份C++学习资源整理,咬牙切齿地好用。
  9. php扩展的xdebug,安装php扩展:Xdebug
  10. mysql all 授权_mysql给数据库授权 GRANT ALL PRIVILEGES ON