Java反射机制在Spring IOC中的应用详解
作者:小草mlc 发布时间:2023-11-10 14:09:32
Java反射机制在Spring IOC的应用
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的反射机制。
反射机制、反射机制的作用、反射机制的功能
1、反射机制的作用
通过java语言中的反射机制可以i操作字节码文件(读和修改字节码文件)
通过反射机制可以操作代码片段(class文件)
2、Java反射机制的功能
在运行时判断一个对象所属的类
在运行时构造一个类的对象
在运行时判断一个类所具有成员变量和方法
在运行时调用一个对象的方法
3、反射机制相关的重要的类有哪些?
java.lang.Class
: 代表整个字节码,代表一个类型,代表整个类。java.lang.reflect.Method
: 代表字节码中的方法字节码,代表类中的方法。java.lang.reflect.Contructor
: 代表字节码中的构造方法字节码,代表类中的构造方法。java.lang.reflect.Field
: 代表字节码中的属性字节码,代表类中的成员变量。
代码如下(示例):
//java.lang.Class
public class User{
//Field
int no;
//Constructor
public User(){
}
public User(int no){
this.no = no;
}
//Method
public void setNo(int no){
this.no = no;
}
}
来源:https://blog.csdn.net/mlc1218559742/article/details/52774805
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 目录一、Ehcache缓存简介Hibernate缓存EhCache缓存特点对比Redis缓存二、集成SpringBoot框架1、核心依赖2、
- 导语:有些时候我们所需要查询的数据量比较大,但是jvm内存又是有限制的,数据量过大会导致内存溢出。这个时候就可以使用流式查询,数据一条条的返
- Oracle的jdbc驱动三种主要分类:1、JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的
- AntPathMatcher前言(1)SpringMVC的路径匹配规则是依照Ant的来的,实际上不只是SpringMVC,整个Spring框
- 单例模式是23种设计模式之一,是比较简单的一种设计模式,它的目的是无论调用多少次,都返回同一个对象,它的特点是构造器私有化。它分为两种结构,
- spring-retry模块支持方法和类、接口、枚举级别的重试方式很简单,引入pom包<parent> <gr
- 目录 - JWT- JWT与其它的区别OAuthCookie/Session Auth- JWT的优点- 认证- JWT的缺点-
- 本文实例为大家分享了javaOpenCV-4.0.0 实时人脸识别,供大家参考,具体内容如下package com.xu.opencv;im
- 加坐标可以使用https://mvnrepository.com/来查找先加以下坐标:使用的数据库介绍:配置连接数据库:spring: &n
- 本文实例为大家分享了Java Socket聊天室功能的具体代码,供大家参考,具体内容如下Client.javaimport java.io.
- gRPCgRPC是由 google开发的一个高性能、通用的开源RPC框架,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多
- 前言最近在优化自己之前基于Spring AOP的统一响应体的实现方案。什么是统一响应体呢?在目前的前后端分离架构下,后端主要是一个RESTf
- 在谈 Volatile 之前,我们先回顾下 Java 内存模型 的三要素:原子性、可见性、有序性,也就是大家常提到的并发编程三要素。并发编程
- 本文实例讲述了Java * 和AOP应用。分享给大家供大家参考,具体如下:一 点睛 * 在AOP(Aspect Orient Progr
- 1、public String(char[] c,begin,length).从字符数组c的下标begin处开始,将长度为length的字符
- jar 包启动时指定配置文件 application.ymlnohup java -jar vPaas.jar --spring.confi
- 一丶先引入上传下载的lib二丶上传的的servletpackage com.test.action;import java.io.File;
- 在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模
- SpringBoot版本:2.3.2.RELEASESpringBoot Data JPA版本:2.3.2.RELEASEJpaReposi
- 这两天实现了下新手引导需要的遮罩镂空shader效果,记录一下。1、圆形镂空shader代码: