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

IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

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

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

  1. <bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>  
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

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

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

  1. //解析<bean .../>元素的id属性得到该字符串值为“courseDao”  
  2. String idStr = "courseDao";  
  3. //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”  
  4. String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";  
  5. //利用反射知识,通过classStr获取Class类对象  
  6. Class<?> cls = Class.forName(classStr);  
  7. //实例化对象  
  8. Object obj = cls.newInstance();  
  9. //container表示Spring容器  
  10. container.put(idStr, obj);  
//解析<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的配置如下所示:

  1. <bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">  
  2.      <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->  
  3.      <property name="courseDao" ref="courseDao"></property>  
  4. </bean>  
<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">
     <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->
     <property name="courseDao" ref="courseDao"></property>
</bean>
我们继续用伪代码的形式来模拟实现一下Spring底层处理原理:

  1. //解析<property .../>元素的name属性得到该字符串值为“courseDao”  
  2. String nameStr = "courseDao";  
  3. //解析<property .../>元素的ref属性得到该字符串值为“courseDao”  
  4. String refStr = "courseDao";  
  5. //生成将要调用setter方法名  
  6. String setterName = "set" + nameStr.substring(01).toUpperCase()  
  7.         + nameStr.substring(1);  
  8. //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数  
  9. Object paramBean = container.get(refStr);  
  10. //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象  
  11. Method setter = cls.getMethod(setterName, paramBean.getClass());  
  12. //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象  
  13. setter.invoke(obj, paramBean);  
//解析<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的反射机制。



原文链接:http://blog.csdn.net/mlc1218559742/article/details/52774805

IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

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

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

  1. <bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>  
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

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

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

  1. //解析<bean .../>元素的id属性得到该字符串值为“courseDao”  
  2. String idStr = "courseDao";  
  3. //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”  
  4. String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";  
  5. //利用反射知识,通过classStr获取Class类对象  
  6. Class<?> cls = Class.forName(classStr);  
  7. //实例化对象  
  8. Object obj = cls.newInstance();  
  9. //container表示Spring容器  
  10. container.put(idStr, obj);  
//解析<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的配置如下所示:

  1. <bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">  
  2.      <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->  
  3.      <property name="courseDao" ref="courseDao"></property>  
  4. </bean>  
<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">
     <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->
     <property name="courseDao" ref="courseDao"></property>
</bean>
我们继续用伪代码的形式来模拟实现一下Spring底层处理原理:

  1. //解析<property .../>元素的name属性得到该字符串值为“courseDao”  
  2. String nameStr = "courseDao";  
  3. //解析<property .../>元素的ref属性得到该字符串值为“courseDao”  
  4. String refStr = "courseDao";  
  5. //生成将要调用setter方法名  
  6. String setterName = "set" + nameStr.substring(01).toUpperCase()  
  7.         + nameStr.substring(1);  
  8. //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数  
  9. Object paramBean = container.get(refStr);  
  10. //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象  
  11. Method setter = cls.getMethod(setterName, paramBean.getClass());  
  12. //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象  
  13. setter.invoke(obj, paramBean);  
//解析<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的反射机制。



原文链接:http://blog.csdn.net/mlc1218559742/article/details/52774805

猜你喜欢

转载自blog.csdn.net/lxs1995/article/details/78785915