SpringIOC概述
什么是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概述相关推荐
- 蚂蚁课堂(每特学院)-2期
蚂蚁课堂2期视频公开-请大家多多支持蚂蚁课堂 密码: tt53 0001-蚂蚁课堂(每特学院)-2期-多线程快速入门 第01节.线程与进程的区别 第02节.为什么要用到多线程 第03节.多线程应用场景 ...
- SSM三大框架从0到1,无障碍学习,萌新可入《一》
框架概述 1.框架的概念 所谓的框架其实就是程序的架子. 把web开发中和业务无关的重复部分提取成通用的程序的架子,就是框架. 2.javaweb开发中的框架SSH 老三大框架:SSH Struts2 ...
- Java开发面经分享:SpringIOC中复杂属性如何“巧妙
private Map<String, Object> maps;private Properties properties; } 下面我们将依次讲解如何给赋值属性赋值.**1.为类属性赋 ...
- Spring-Spring配置概述
Spring容器高层视图 成功启动Spring容器的三个必要条件 Bean配置信息 基于XML的配置 Schema的配置格式 Bean的基本配置 装载一个Bean Bean的命名 总结 导读 Spri ...
- (SpringMVC)概述和简单使用
文章目录 1. 什么是SpringMVC 1.1 概述 1.2 中心控制器 1.3 SpringMVC执行原理 2. 简单使用 2.1 配置版 2.2 注解版 3. 总结 1. 什么是SpringMV ...
- SpringIOC容器介绍
IOC & DI 概述 配置 bean 配置形式:基于 XML 文件的方式:基于注解的方式 Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).F ...
- SpringIOC容器-对象依赖
1 概述 Spring中,如何给对象的属性赋值? [DI, 依赖注入] 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4) 自动装配 5) 注解 1.1 通过构造函数 &l ...
- spring基础概述
1.Spring概述Spring是分层的java SE/EE应用 full-stack 轻量级开源框架,以IOC(Inverse of control)翻转控制和AOP(Aspect Oriented ...
- Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用
1. Spring Boot概述 Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 首页Spring Boot简介可以 ...
最新文章
- POJ3268 Silver Cow Party(最短路径)
- java int.parse_java数据类型转换,parseXXX(String)或valueOf(String)有什么区别?
- mac支持NVDANV顯卡型號持列表
- 使用 JavaScript 进行 Base64 编码与解码
- VC++打开、保存文件对话框和浏览文件夹对话框
- 英国法院裁定GCHQ黑客发动网络攻击并不侵犯人权
- Picocli 2.0:事半功倍
- 在vc++里面进行图像处理的时候应该把图形放哪_图形找朋友小班教案
- Facebook 有序队列服务设计原理和高性能浅析
- php-5.6 安装部署整理
- 权限管理框架之Shiro
- 联想智能云教室安win7_用“联想智能云教室”部署系统完成后,操作卡顿?
- 计算机硬盘的内存单位换算,内存的单位换算
- 计算机三级网络技术知识点大全(九)
- pgsql 日期转换
- 莫古力最新服务器,《最终幻想14》将调整现有人口平均化策略
- win10家庭版如何安装Windows Sandbox
- getTime()得到时间戳不一样
- 学籍管理系统java_学籍管理系统(Java初级版)
- syntax error, expect [, actual {, pos 0, fieldName null解决方法
热门文章
- 【struts2】struts2的零配置
- rtti获取类的字段和属性和方法
- 优化PHP程序的方法(温故知新)
- Hibernate随机获取指定范围内的指定条目的记录
- 会场安排问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=14
- JSP、Servlet、Tomcat、JDK、J2EE版本比较
- 零基础入门 HTML 的 8 分钟极简教程
- 一份C++学习资源整理,咬牙切齿地好用。
- php扩展的xdebug,安装php扩展:Xdebug
- mysql all 授权_mysql给数据库授权 GRANT ALL PRIVILEGES ON