Spring核心之IOC&反射

IOC思想:Spring容器来实现相互依赖对象的创建,协调工作。对象只需要关心业务逻辑本身就好了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。控制反转就是获得依赖对象的方式反转了由Spring来负责控制对象的生命周期和对象间的关系

IOC(控制反转)之中的核心是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。

那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

ApplicationContext context = new FileSystemXmlApplicationContext(  "applicationContext.xml");

A a = (A) context.getBean("a");

pojo类的属性也是可以通过Spring注入进去的。Spirng不但可以注入基本类型,而且可以注入像List,Map这样的类型。

Map类型的配置:

 1 <bean id="test" class="Test">
 2         <property name="testMap">
 3             <map>
 4                 <entry key="a">
 5                     <value>1</value>
 6                 </entry>
 7                 <entry key="b">
 8                     <value>2</value>
 9                 </entry>
10             </map>
11         </property>
12     </bean>  

<bean id="userAction" class="com.dobestself.action.UserAction"          scope="prototype">     <property name="userBO" ref="userBO" />   论property可以传递的类型,如果把ref换成value则直接传递字符串(值),如果传递另外的bean,则要用ref。如果传递Map,参考上文。 </bean>

Spring运行机制剖析:

  1 //定义一个Bean类,这个类用于存放一个Bean拥有的属性。
  2 /* Bean Id */
  3     private String id;
  4     /* Bean Class */
  5     private String type;
  6     /* Bean Property */
  7  private Map<String, Object> properties = new HashMap<String, Object>();
  8 /*接下来Spring 就开始加载我们的配置文件了,将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,只有这样我们才能通过context.getBean("animal")这个方法获得Animal这个类。我们都知道Spirng可以注入基本类型,而且可以注入像List,Map这样的类型,接下来就让我们以Map为例看看Spring是怎么保存的吧*/
  9 //Map配置可以像下面的
 10 <bean id="test" class="Test">
 11         <property name="testMap">
 12             <map>
 13                 <entry key="a">
 14                     <value>1</value>
 15                 </entry>
 16                 <entry key="b">
 17                     <value>2</value>
 18                 </entry>
 19             </map>
 20         </property>
 21     </bean>
 22 //Spring是怎样保存上面的配置
 23 if (beanProperty.element("map") != null) {
 24                     Map<String, Object> propertiesMap = new HashMap<String, Object>();
 25                     Element propertiesListMap = (Element) beanProperty
 26                             .elements().get(0);
 27                     Iterator<?> propertiesIterator = propertiesListMap
 28                             .elements().iterator();
 29                     while (propertiesIterator.hasNext()) {
 30                         Element vet = (Element) propertiesIterator.next();
 31                         if (vet.getName().equals("entry")) {
 32                             String key = vet.attributeValue("key");
 33                             Iterator<?> valuesIterator = vet.elements()
 34                                     .iterator();
 35                             while (valuesIterator.hasNext()) {
 36                                 Element value = (Element) valuesIterator.next();
 37                                 if (value.getName().equals("value")) {
 38                                     propertiesMap.put(key, value.getText());
 39                                 }
 40                                 if (value.getName().equals("ref")) {
 41                                     propertiesMap.put(key, new String[] { value
 42                                             .attributeValue("bean") });
 43                                 }
 44                             }
 45                         }
 46                     }
 47                     bean.getProperties().put(name, propertiesMap);
 48                 }
 49 /*接下来就进入最核心部分了,让我们看看Spring 到底是怎么依赖注入的吧,其实依赖注入的思想也很简单,它是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。让我们看看具体它是怎么做的吧。
 50 首先实例化一个类,像这样 */
 51 public static Object newInstance(String className) {
 52         Class<?> cls = null;
 53         Object obj = null;
 54         try {
 55             cls = Class.forName(className);
 56             obj = cls.newInstance();
 57         } catch (ClassNotFoundException e) {
 58             throw new RuntimeException(e);
 59         } catch (InstantiationException e) {
 60             throw new RuntimeException(e);
 61         } catch (IllegalAccessException e) {
 62             throw new RuntimeException(e);
 63         }
 64         return obj;
 65     }
 66 //接着它将这个类的依赖注入进去,像这样
 67 public static void setProperty(Object obj, String name, String value) {
 68         Class<? extends Object> clazz = obj.getClass();
 69         try {
 70             String methodName = returnSetMthodName(name);
 71             Method[] ms = clazz.getMethods();
 72             for (Method m : ms) {
 73                 if (m.getName().equals(methodName)) {
 74                     if (m.getParameterTypes().length == 1) {
 75                         Class<?> clazzParameterType = m.getParameterTypes()[0];
 76                         setFieldValue(clazzParameterType.getName(), value, m,
 77                                 obj);
 78                         break;
 79                     }
 80                 }
 81             }
 82         } catch (SecurityException e) {
 83             throw new RuntimeException(e);
 84         } catch (IllegalArgumentException e) {
 85             throw new RuntimeException(e);
 86         } catch (IllegalAccessException e) {
 87             throw new RuntimeException(e);
 88         } catch (InvocationTargetException e) {
 89             throw new RuntimeException(e);
 90         }
 91 }
 92 /*最后它将这个类的实例返回给我们,我们就可以用了。我们还是以Map为例看看它是怎么做的,我写的代码里面是创建一个HashMap并把该HashMap注入到需要注入的类中,像这样,*/
 93 if (value instanceof Map) {
 94                 Iterator<?> entryIterator = ((Map<?, ?>) value).entrySet()
 95                         .iterator();
 96                 Map<String, Object> map = new HashMap<String, Object>();
 97                 while (entryIterator.hasNext()) {
 98                     Entry<?, ?> entryMap = (Entry<?, ?>) entryIterator.next();
 99                     if (entryMap.getValue() instanceof String[]) {
100                         map.put((String) entryMap.getKey(),
101                                 getBean(((String[]) entryMap.getValue())[0]));
102                     }
103                 }
104                 BeanProcesser.setProperty(obj, property, map);
105             }  

反射:由对象反推类

 1 public static void printMethods(Class cl)
 2 {
 3 Method[] methods =cl.getDeclaredMethods();//返回一个包含方法对象的数组
 4 for(Method m : methods)//循环该类的每个方法
 5 {
 6 Class retType = m.getReturnType();//该方法的返回类型,
 7 Sting name = m.getName();//获得方法名
 8 Systen.out.print(" "+Modifier.toString(m.getModifiers());打印方法修饰符
 9 System.out.print(" "+retType.getName() + " " + name +"(");
10
11 Class[] paramTypes = m.getParameterTypes();//获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)
12
13 for(int j = 0 ; j < paramTypes.length ; j++)
14
15 {
16 if ( j > 0 ) System.out.print(" , ");   //如果有多个参数,中间则用逗号隔开,否则直接打印参数
17 System.out.print (paramTypes[ j ].getName);
18 }
19 System.out.println (" );");
20 }}
21
22 //////////getparameterTypes方法用于返回一个描述参数类型的Class对象数组)

参考文献:

http://blog.csdn.net/it_man/article/details/4402245

时间: 2024-10-08 17:48:51

Spring核心之IOC&反射的相关文章

SPRING源码解析-SPRING 核心-IOC

IoC 和 AOP是Spring的核心, 是Spring系统中其他组件模块和应用开发的基础.透过这两个模块的设计和实现可以了解Spring倡导的对企业应用开发所应秉承的思路: 易用性. POJO开发企业应用, 直接依赖于Java语言,而不是容器和框架. 提升程序的可测试性,提高软件质量. 提供一致性编程模型,面向接口的编程 降低应用的负载和框架的侵入性.IoC和AOP实现. 不作为现有解决方案的替代,而是集成现有. IoC和AOP这两个核心组件,特别是IoC容器,使用户在使用Spring完成PO

Spring核心之Ioc容器走读笔记

其实说到Spring的核心,无非指的就是Ioc容器和AOP. Spring降低了应用的负载和框架的侵入性,依靠的解决方案正是Ioc和AOP的支持. 学习Spring的Ioc和Aop的设计模式可以帮助我们在自己编写代码的时候如何优雅的设计和实现. 这里就只记录一下自己对Ioc容器设计和实现的走读和思考. 在查看Spring Ioc容器的设计文档和源代码后,发现其实只有2类主要的容器: 一类是实现BeanFactory接口,这类的容器只实现了基本的方法,从名字上就大概能知道是什么功能:一类是实现Ap

Spring核心之IOC

IOC是Spring的两大核心之一:IOC的核心就是解耦. 举个例子:有2个班级可以上课,校长指定老师去上课,代码如下 package com.hongcong.test; public class Class1 { public void teach(){ System.out.println("一班在上课"); } } package com.hongcong.test; public class Class2 { public void teach(){ System.out.p

Spring核心(ioc控制反转)

 IoC,Inversion Of Control 即控制反转,由容器来管理业务对象之间的依赖关系,而非传统方式中的由代码来管理. 其本质,即将控制权由应用程序代码转到了外部容器,控制权的转移就是所谓的反转,其带来的最大的好处是降低了业务对象之间的依赖程度,即实现了解耦. Spring的IoC容器主要使用DI(Dependency Injection,依赖注入)方式实现的.不需要主动查找,对象的查找.定位和创建全部由容器管理,容器会将符合依赖关系的对象通过属性(setter等)或者构造函数传

Spring核心之IoC——依赖注入

在J2EE开发平台中,Spring是一种优秀的轻量级企业应用解决方案.Spring倡导一切从实际出发,它的核心技术就是IOC(控制反转)和AOP(面向切面编程)技术.本文用的Spring版本为spring-framework-2.5.6(通过Myeclipse导入),不同版本的jar包可能会存在不同的区别. Spring内置了日志组件log4j.jar,所以在正式使用Spring之前需要对log4j进行简单的配置,在项目的src根目录下创建log4j.properties属性文件.具体代码如下:

Spring 核心容器 IOC

目录 1. BeanFactory 2. BeanDefinition 3.BeanDefinitionReader 4 . Web IOC 容器初体验 一 .BeanFactory Spring Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,也即 IOC 容器为开发者管理对象间的依赖关系提供了很多便利和基础服务.最基本的 IOC 容器接口 BeanFactory,来看一下它的源码: public interface BeanFactory { //对 FactoryBean 的

2019.12.02——Spring学习(ioc)

Spring概念 1. Spring是开源的轻量级框架: 2. Spring核心:IOC(控制反转).AOP(面向切面编程): 3. Spring是一站式框架:Spring在javaee三层结构中,每层都提供不同的解决技术: - web层:springMVC - service层:IOC - dao层:JDBCTemplate Spring的IOC操作 1. 对象创建交给Spring进行管理: 2. IOC操作的两种方式:配置文件.注解. IOC底层原理 原文链接:Spring IOC的原理及详

Spring核心思想之IOC总结

说到Spring的核心思想Ioc和aop不是Spring提出来的,在Spring之前就已经存在,只不过更偏向理论化,Spring在技术层次把两个思想做了非常好的实现(java) 第一部分:什么是IOCIOC Inversion of Control (控制反转/反转控制),注意它是?个技术思想,不是?个技术实现描述的事情:Java开发领域对象的创建,管理的问题传统开发?式:?如类A依赖于类B,往往会在类A中new?个B的对象 IoC思想下开发?式:我们不???去new对象了,?是由IoC容器(S

Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)

Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个类,在类中有个方法(非静态的方法),要调用类中的这个方法,则需要创建类的对象,使用对象调用方法.创建类对象的过程,需要new出来对象:而ioc则是将对象的创建不是通过new方式实现,而是交给spring配置来创建对象(即,将对象的创建交给spring来管理): spring是一站式框架 spring