在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
//解析元素的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();
//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
我们继续用伪代码的形式来模拟实现一下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方法名
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