java反射机制在spring_Java反射机制在Spring IOC中的应用

45f4844e986444dd703253f2f438056a.png

在java开发中,ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。提到ioc,第一反应就是控制反转,我以前以为springioc就是控制反转,控制反转就是springioc,当然这种理解是错误的,控制反转是一种思想,一种模式,而spring的ioc容器是实现了这种思想这种模式的一个载体.。即通过spring容器控制对象之间的依赖关系,而不是对象自己通过new的方式去创建依赖的对象,相对于主动去创建对象,这种失去对对象的控制便叫做控制反转,控制反转用另一种角度描述或者更好的一种理解方式来讲java反射机制,便是di(dependency injection)依赖注入,对象只需关注业务逻辑本身即可,而不需关注依赖的对象从哪里来,交给容器注入即可,从而降低程序之间的耦合度。

本篇文章主要讲解一下IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。

在spring的配置文件中,经常看到如下配置:

[html]view plain

那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对java反射机制,就是通过反射!!!

下面是Spring通过配置进行实例化对象,并放到容器中的伪代码:

[html]view plain

79178f2e865841e6a1239b1177db0872.png

//解析元素的id属性得到该字符串值为“courseDao”

StringidStr="courseDao";

网页元素特征字符串是一个用来描述网页元素标签特征的字符串,用于定位指定元素特征串格式:属性1:值1&属性2:值2&属性3:值3&属性4:值4特征串由“&”链接,使用“:”分隔属性名称与属性值。5)完成n0个象素点的叠加:设某一象素点的亮度值为y,用1个字节表示,待叠加字符的亮度值为常数c,用1个字节表示,当已取出的组成该点阵字符的某一行n位中的某一位为1,则将原图像中该位对应象素点的亮度值y改为c,如果该位为0,则保持原图像中该位对应象素点的亮度值不变,依据该原则,完成n0个象素点的叠加。将源串strsource开始的count个字符添加到目标串strdest后. 源串strsource的字符会覆盖目标串strdestination后面的结束符null. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上null结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况. 函数返回strdestination值.。

StringclassStr="com.qcjy.learning.Dao.impl.CourseDaoImpl";

//利用反射知识,通过classStr获取Class类对象

Class>cls=Class.forName(classStr);

//实例化对象

Objectobj=cls.newInstance();

3b098bd0270b7ef48263e74b891d2807.png

//container表示Spring容器

container.put(idStr,obj);

一般spring容器默认bean的作用域为singleton2>prototype:与singleton相反,每次通过容器的getbean()方法获取该作用域下的bean时都将产生一个新的bean实例3>request:对于同一次http请求,request作用域下的bean都将只生成一个实例。一般spring容器默认bean的作用域为singleton2>prototype:与singleton相反,每次通过容器的getbean()方法获取该作用域下的bean时都将产生一个新的bean实例3>request:对于同一次http请求,request作用域下的bean都将只生成一个实例。一般spring容器默认bean的作用域为singleton2>prototype:与singleton相反,每次通过容器的getbean()方法获取该作用域下的bean时都将产生一个新的bean实例3>request:对于同一次http请求,request作用域下的bean都将只生成一个实例。

当一个类里面需要应用另一类的对象时,Spring的配置如下所示:

[html]view plain

c32ea4a5fad7fa55a9cf098dfd00ca5e.png

我们继续用伪代码的形式来模拟实现一下Spring底层处理原理:

[java]view plain

网页元素特征字符串是一个用来描述网页元素标签特征的字符串,用于定位指定元素特征串格式:属性1:值1&属性2:值2&属性3:值3&属性4:值4特征串由“&”链接,使用“:”分隔属性名称与属性值。5)完成n0个象素点的叠加:设某一象素点的亮度值为y,用1个字节表示,待叠加字符的亮度值为常数c,用1个字节表示,当已取出的组成该点阵字符的某一行n位中的某一位为1,则将原图像中该位对应象素点的亮度值y改为c,如果该位为0,则保持原图像中该位对应象素点的亮度值不变,依据该原则,完成n0个象素点的叠加。将源串strsource开始的count个字符添加到目标串strdest后. 源串strsource的字符会覆盖目标串strdestination后面的结束符null. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上null结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况. 函数返回strdestination值.。

StringnameStr="courseDao";

//解析元素的ref属性得到该字符串值为“courseDao”

StringrefStr="courseDao";

//生成将要调用setter方法名

70e3f9c95016b122a9c13cf44f9a242b.png

if (integer.parseint(idno.substring(16).substring(0, 1)) % 2 == 0) {。 el.dom['offset' + a[0].charat(0).touppercase() + a[0].substr(1)] : 0。 1miss, 载入(set 1, loc 0) set 1 1 set 0 lru0 。

+nameStr.substring(1);

//获取spring容器中名为refStr的Bean,该Bean将会作为传入参数

ObjectparamBean=container.get(refStr);

//获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象

class cls = classloaderutils.loadclass(cname, this.getclass())。february 17, 2017-website name: cls web site address: e-mail: 0... site description: cls cls network network dahongmen miki cls cls cls telepresence brand network represented network test...。method method=cls.getmethod("test",string.class,string.class)。

//调用invoke()方法,此处的obj是刚才反射代码得到的Object对象

setter.invoke(obj,paramBean);

我认为这两个概念还是有区别的,自省是一个目的或者说机制,是一个上层的接口封装,而反射是达到这个目的或者实现这个机制的方法,是底层的具体实现。容器启动过程:需简化容器启动脚本,使得启动过程尽量轻量,对于对延时敏感的业务,提供实例预留机制,用户可选择预留少量实例以减少第一次调用的额外延时。原理部分,能够大概了解memcached的内存结构 (slab机制),redis就了解常用数据类型底层实现存储结构(sds/链表/skiplist/hashtable)等等,顺便了解一下redis 的事务、rdb、aof等机制更好。

只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-111386-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值