Java反射机制在Spring IOC中的应用
2023-09-27 14:27:40 时间
IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
本篇文章主要讲解一下IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。
在Spring的配置文件中,经常看到如下配置:
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>
那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!
下面是Spring通过配置进行实例化对象,并放到容器中的伪代码:
//解析<bean .../>元素的id属性得到该字符串值为“courseDao” String idStr = "courseDao"; //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl” String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl"; //利用反射知识,通过classStr获取Class类对象 Class<?> cls = Class.forName(classStr); //实例化对象 Object obj = cls.newInstance(); //container表示Spring容器 container.put(idStr, obj);
通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。
当一个类里面需要应用另一类的对象时,Spring的配置如下所示:
<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl"> <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 --> <property name="courseDao" ref="courseDao"></property> </bean>
我们继续用伪代码的形式来模拟实现一下Spring底层处理原理:
//解析<property .../>元素的name属性得到该字符串值为“courseDao” String nameStr = "courseDao"; //解析<property .../>元素的ref属性得到该字符串值为“courseDao” String refStr = "courseDao"; //生成将要调用setter方法名 String setterName = "set" + nameStr.substring(0, 1).toUpperCase() + nameStr.substring(1); //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数 Object paramBean = container.get(refStr); //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象 Method setter = cls.getMethod(setterName, paramBean.getClass()); //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象 setter.invoke(obj, paramBean);
通过上面对Spring底层原理的分析,可以发现,其实并不难,用到的都是反射机制,通过反射实例化对象,存入到Spring的bean容器中。
只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。
https://blog.csdn.net/mlc1218559742/article/details/52774805
相关文章
- java实现基于IO流存取信息的【学生成绩管理系统】
- selenium+java项目实战---百度输入框
- Spring Boot JPA中java 8 的应用
- Java数据类型—String进阶之字符串常量池
- Java启动参数(-, -X, -XX参数)详解
- JAVA单元测试框架-14-实现TestNG失败案例重跑
- 2022年Java秋招面试必看的 | Spring Cloud 面试题
- 还在担心 2022 的秋招吗, 啃透这份 Java 架构知识点笔记,薪资必涨。
- Spring-boot-Java工程添加prometheus监控(actuator+micrometer和simpleclient+micrometer两种方案)
- 第63节:Java中的Spring MVC简介笔记
- 第63节:Java中的Spring MVC简介笔记
- Java接口详细讲解
- 基于Java(Spring Boot)+MySQL实现电商网站【100010419】
- 从零开始学 Java - Spring 一主多从、多主多从 数据库配置
- Spring Boot JPA中java 8 的应用
- Android Studio 4.0+ 右键新建无Java class 问题解决
- java (Spring) 控制器中返回图片(验证码需求)
- Java spring mvc jsp excel 导入
- 华为OD机试 - 消消乐游戏(Java) | 机试题+算法思路+考点+代码解析 【2023】
- Java高手速成 | Spring、JPA与Hibernate的整合
- Java学习之路-Spring的HttpInvoker学习
- 1024 科学计数法 (20 分)C与Java
- Java开发 - Spring MVC框架初体验
- Java小白入门200例95之Java匿名类
- 【Java】定义魔法数字,以及枚举类的构造方法的使用
- Java MyBatis-Plus 获取自增长id
- Java使用aopse实现word转换pdf
- Java-类和对象