spring ioc di 原理解析

spring ioc原理(看完后大家可以自己写一个spring)

控制反转/依赖注入

 

其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩。Java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关系业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。

这是我对Spring的IOC的体会。DI其实就是IOC的另外一种说法。DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:获得依赖对象的方式反转了。

如果对这一核心概念还不理解:这里引用一个叫Bromonblog上找到的浅显易懂的答案:



IoCDI

  首先想说说IoCInversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比Connection等),对象始终会和其他的接口或类藕合起来。

  那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DIDependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉springA中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅java doc
 理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。

如果还不明白,放弃java吧!

 

下面来让大家了解一下Spring到底是怎么运行的。

Java代码
  1. public static void main(String[] args) {   
  2.         ApplicationContext context = new FileSystemXmlApplicationContext(   
  3.                 "applicationContext.xml");   
  4.         Animal animal = (Animal) context.getBean("animal");   
  5.         animal.say();   
  6.     }  
[java] view plain copy
print ?
  1. public static void main(String[] args) {  
  2.         ApplicationContext context = new FileSystemXmlApplicationContext(  
  3.                 "applicationContext.xml");  
  4.         Animal animal = (Animal) context.getBean("animal");  
  5.         animal.say();  
  6.     }  
public static void main(String[] args) {
		ApplicationContext context = new FileSystemXmlApplicationContext(
				"applicationContext.xml");
		Animal animal = (Animal) context.getBean("animal");
		animal.say();
	}


这段代码你一定很熟悉吧,不过还是让我们分析一下它吧,首先是applicationContext.xml

Java代码
  1. "animal" class="phz.springframework.test.Cat">   
  2.         "name" value="kitty" />   
  3.       
[java] view plain copy
print ?
  1. "animal" class="phz.springframework.test.Cat">  
  2.         "name" value="kitty" />  
  3.       

		
	


他有一个类phz.springframework.test.Cat

Java代码
  1. public class Cat implements Animal {   
  2.     private String name;   
  3.     public void say() {   
  4.         System.out.println("I am " + name + "!");   
  5.     }   
  6.     public void setName(String name) {   
  7.         this.name = name;   
  8.     }   
  9. }  
[java] view plain copy
print ?
  1. public class Cat implements Animal {  
  2.     private String name;  
  3.     public void say() {  
  4.         System.out.println("I am " + name + "!");  
  5.     }  
  6.     public void setName(String name) {  
  7.         this.name = name;  
  8.     }  
  9. }  
public class Cat implements Animal {
	private String name;
	public void say() {
		System.out.println("I am " + name + "!");
	}
	public void setName(String name) {
		this.name = name;
	}
}


实现了phz.springframework.test.Animal接口

Java代码
  1. public interface Animal {   
  2.     public void say();   
  3. }  
[java] view plain copy
print ?
  1. public interface Animal {  
  2.     public void say();  
  3. }  
public interface Animal {
	public void say();
}


很明显上面的代码输出I am kitty!

那么到底Spring是如何做到的呢?
接下来就让我们自己写个Spring 来看看Spring 到底是怎么运行的吧!

首先,我们定义一个Bean类,这个类用来存放一个Bean拥有的属性

Java代码
  1. /* Bean Id */  
  2.     private String id;   
  3.     /* Bean Class */  
  4.     private String type;   
  5.     /* Bean Property */  
  6.     private Map properties = new HashMap();  
[java] view plain copy
print ?
  1. /* Bean Id */  
  2.     private String id;  
  3.     /* Bean Class */  
  4.     private String type;  
  5.     /* Bean Property */  
  6.     private Map properties = new HashMap();  
/* Bean Id */
	private String id;
	/* Bean Class */
	private String type;
	/* Bean Property */
	private Map properties = new HashMap();


一个Bean包括id,type,和Properties。

接下来Spring 就开始加载我们的配置文件了,将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,只有这样我们才能通过context.getBean("animal")这个方法获得Animal这个类。我们都知道Spirng可以注入基本类型,而且可以注入像List,Map这样的类型,接下来就让我们以Map为例看看Spring是怎么保存的吧

Map配置可以像下面的

Java代码
  1. "test" class="Test">   
  2.         "testMap">   
  3.                
  4.                 "a">   
  5.                     1   
  6.                    
  7.                 "b">   
  8.                     2   
  9.                    
  10.                
  11.            
  12.       
[java] view plain copy
print ?
  1. "test" class="Test">  
  2.         "testMap">  
  3.               
  4.                 "a">  
  5.                     1  
  6.                   
  7.                 "b">  
  8.                     2  
  9.                   
  10.               
  11.           
  12.       

		
			
				
					1
				
				
					2
				
			
		
	


Spring是怎样保存上面的配置呢?,代码如下:

Java代码
  1. if (beanProperty.element("map") != null) {   
  2.                     Map propertiesMap = new HashMap();   
  3.                     Element propertiesListMap = (Element) beanProperty   
  4.                             .elements().get(0);   
  5.                     Iterator propertiesIterator = propertiesListMap   
  6.                             .elements().iterator();   
  7.                     while (propertiesIterator.hasNext()) {   
  8.                         Element vet = (Element) propertiesIterator.next();   
  9.                         if (vet.getName().equals("entry")) {   
  10.                             String key = vet.attributeValue("key");   
  11.                             Iterator valuesIterator = vet.elements()   
  12.                                     .iterator();   
  13.                             while (valuesIterator.hasNext()) {   
  14.                                 Element value = (Element) valuesIterator.next();   
  15.                                 if (value.getName().equals("value")) {   
  16.                                     propertiesMap.put(key, value.getText());   
  17.                                 }   
  18.                                 if (value.getName().equals("ref")) {   
  19.                                     propertiesMap.put(key, new String[] { value   
  20.                                             .attributeValue("bean") });   
  21.                                 }   
  22.                             }   
  23.                         }   
  24.                     }   
  25.                     bean.getProperties().put(name, propertiesMap);   
  26.                 }  
[java] view plain copy
print ?
  1. if (beanProperty.element("map") != null) {  
  2.                     Map propertiesMap = new HashMap();  
  3.                     Element propertiesListMap = (Element) beanProperty  
  4.                             .elements().get(0);  
  5.                     Iterator propertiesIterator = propertiesListMap  
  6.                             .elements().iterator();  
  7.                     while (propertiesIterator.hasNext()) {  
  8.                         Element vet = (Element) propertiesIterator.next();  
  9.                         if (vet.getName().equals("entry")) {  
  10.                             String key = vet.attributeValue("key");  
  11.                             Iterator valuesIterator = vet.elements()  
  12.                                     .iterator();  
  13.                             while (valuesIterator.hasNext()) {  
  14.                                 Element value = (Element) valuesIterator.next();  
  15.                                 if (value.getName().equals("value")) {  
  16.                                     propertiesMap.put(key, value.getText());  
  17.                                 }  
  18.                                 if (value.getName().equals("ref")) {  
  19.                                     propertiesMap.put(key, new String[] { value  
  20.                                             .attributeValue("bean") });  
  21.                                 }  
  22.                             }  
  23.                         }  
  24.                     }  
  25.                     bean.getProperties().put(name, propertiesMap);  
  26.                 }  
if (beanProperty.element("map") != null) {
					Map propertiesMap = new HashMap();
					Element propertiesListMap = (Element) beanProperty
							.elements().get(0);
					Iterator propertiesIterator = propertiesListMap
							.elements().iterator();
					while (propertiesIterator.hasNext()) {
						Element vet = (Element) propertiesIterator.next();
						if (vet.getName().equals("entry")) {
							String key = vet.attributeValue("key");
							Iterator valuesIterator = vet.elements()
									.iterator();
							while (valuesIterator.hasNext()) {
								Element value = (Element) valuesIterator.next();
								if (value.getName().equals("value")) {
									propertiesMap.put(key, value.getText());
								}
								if (value.getName().equals("ref")) {
									propertiesMap.put(key, new String[] { value
											.attributeValue("bean") });
								}
							}
						}
					}
					bean.getProperties().put(name, propertiesMap);
				}



接下来就进入最核心部分了,让我们看看Spring 到底是怎么依赖注入的吧,其实依赖注入的思想也很简单,它是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。让我们看看具体它是怎么做的吧。
首先实例化一个类,像这样

Java代码
  1. public static Object newInstance(String className) {   
  2.         Class cls = null;   
  3.         Object obj = null;   
  4.         try {   
  5.             cls = Class.forName(className);   
  6.             obj = cls.newInstance();   
  7.         } catch (ClassNotFoundException e) {   
  8.             throw new RuntimeException(e);   
  9.         } catch (InstantiationException e) {   
  10.             throw new RuntimeException(e);   
  11.         } catch (IllegalAccessException e) {   
  12.             throw new RuntimeException(e);   
  13.         }   
  14.         return obj;   
  15.     }  
[java] view plain copy
print ?
  1. public static Object newInstance(String className) {  
  2.         Class cls = null;  
  3.         Object obj = null;  
  4.         try {  
  5.             cls = Class.forName(className);  
  6.             obj = cls.newInstance();  
  7.         } catch (ClassNotFoundException e) {  
  8.             throw new RuntimeException(e);  
  9.         } catch (InstantiationException e) {  
  10.             throw new RuntimeException(e);  
  11.         } catch (IllegalAccessException e) {  
  12.             throw new RuntimeException(e);  
  13.         }  
  14.         return obj;  
  15.     }  
public static Object newInstance(String className) {
		Class cls = null;
		Object obj = null;
		try {
			cls = Class.forName(className);
			obj = cls.newInstance();
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		} catch (InstantiationException e) {
			throw new RuntimeException(e);
		} catch (IllegalAccessException e) {
			throw new RuntimeException(e);
		}
		return obj;
	}


接着它将这个类的依赖注入进去,像这样

Java代码
  1. public static void setProperty(Object obj, String name, String value) {   
  2.         Classextends Object> clazz = obj.getClass();   
  3.         try {   
  4.             String methodName = returnSetMthodName(name);   
  5.             Method[] ms = clazz.getMethods();   
  6.             for (Method m : ms) {   
  7.                 if (m.getName().equals(methodName)) {   
  8.                     if (m.getParameterTypes().length == 1) {   
  9.                         Class clazzParameterType = m.getParameterTypes()[0];   
  10.                         setFieldValue(clazzParameterType.getName(), value, m,   
  11.                                 obj);   
  12.                         break;   
  13.                     }   
  14.                 }   
  15.             }   
  16.         } catch (SecurityException e) {   
  17.             throw new RuntimeException(e);   
  18.         } catch (IllegalArgumentException e) {   
  19.             throw new RuntimeException(e);   
  20.         } catch (IllegalAccessException e) {   
  21.             throw new RuntimeException(e);   
  22.         } catch (InvocationTargetException e) {   
  23.             throw new RuntimeException(e);   
  24.         }   
  25. }  
[java] view plain copy
print ?
  1. public static void setProperty(Object obj, String name, String value) {  
  2.         Classextends Object> clazz = obj.getClass();  
  3.         try {  
  4.             String methodName = returnSetMthodName(name);  
  5.             Method[] ms = clazz.getMethods();  
  6.             for (Method m : ms) {  
  7.                 if (m.getName().equals(methodName)) {  
  8.                     if (m.getParameterTypes().length == 1) {  
  9.                         Class clazzParameterType = m.getParameterTypes()[0];  
  10.                         setFieldValue(clazzParameterType.getName(), value, m,  
  11.                                 obj);  
  12.                         break;  
  13.                     }  
  14.                 }  
  15.             }  
  16.         } catch (SecurityException e) {  
  17.             throw new RuntimeException(e);  
  18.         } catch (IllegalArgumentException e) {  
  19.             throw new RuntimeException(e);  
  20.         } catch (IllegalAccessException e) {  
  21.             throw new RuntimeException(e);  
  22.         } catch (InvocationTargetException e) {  
  23.             throw new RuntimeException(e);  
  24.         }  
  25. }  
public static void setProperty(Object obj, String name, String value) {
		Class clazz = obj.getClass();
		try {
			String methodName = returnSetMthodName(name);
			Method[] ms = clazz.getMethods();
			for (Method m : ms) {
				if (m.getName().equals(methodName)) {
					if (m.getParameterTypes().length == 1) {
						Class clazzParameterType = m.getParameterTypes()[0];
						setFieldValue(clazzParameterType.getName(), value, m,
								obj);
						break;
					}
				}
			}
		} catch (SecurityException e) {
			throw new RuntimeException(e);
		} catch (IllegalArgumentException e) {
			throw new RuntimeException(e);
		} catch (IllegalAccessException e) {
			throw new RuntimeException(e);
		} catch (InvocationTargetException e) {
			throw new RuntimeException(e);
		}
}


最后它将这个类的实例返回给我们,我们就可以用了。我们还是以Map为例看看它是怎么做的,我写的代码里面是创建一个HashMap并把该HashMap注入到需要注入的类中,像这样,

Java代码
  1. if (value instanceof Map) {   
  2.                 Iterator entryIterator = ((Map) value).entrySet()   
  3.                         .iterator();   
  4.                 Map map = new HashMap();   
  5.                 while (entryIterator.hasNext()) {   
  6.                     Entry entryMap = (Entry) entryIterator.next();   
  7.                     if (entryMap.getValue() instanceof String[]) {   
  8.                         map.put((String) entryMap.getKey(),   
  9.                                 getBean(((String[]) entryMap.getValue())[0]));   
  10.                     }   
  11.                 }   
  12.                 BeanProcesser.setProperty(obj, property, map);   
  13.             }  
[java] view plain copy
print ?
  1. if (value instanceof Map) {  
  2.                 Iterator entryIterator = ((Map) value).entrySet()  
  3.                         .iterator();  
  4.                 Map map = new HashMap();  
  5.                 while (entryIterator.hasNext()) {  
  6.                     Entry entryMap = (Entry) entryIterator.next();  
  7.                     if (entryMap.getValue() instanceof String[]) {  
  8.                         map.put((String) entryMap.getKey(),  
  9.                                 getBean(((String[]) entryMap.getValue())[0]));  
  10.                     }  
  11.                 }  
  12.                 BeanProcesser.setProperty(obj, property, map);  
  13.             }  
if (value instanceof Map) {
				Iterator entryIterator = ((Map) value).entrySet()
						.iterator();
				Map map = new HashMap();
				while (entryIterator.hasNext()) {
					Entry entryMap = (Entry) entryIterator.next();
					if (entryMap.getValue() instanceof String[]) {
						map.put((String) entryMap.getKey(),
								getBean(((String[]) entryMap.getValue())[0]));
					}
				}
				BeanProcesser.setProperty(obj, property, map);
			}


好了,这样我们就可以用Spring 给我们创建的类了,是不是也不是很难啊?当然Spring能做到的远不止这些,这个示例程序仅仅提供了Spring最核心的依赖注入功能中的一部分。
本文参考了大量文章无法一一感谢,在这一起感谢,如果侵犯了你的版权深表歉意,很希望对大家有帮助!

 

 

88
14
 
 

我的同类文章

开源技术(如Struts/spring/Hibernate等)(70)
http://blog.csdn.net
  • Spring AOP 实现原理2015-12-09阅读1755
  • Netty Channel 接口名词理解2014-08-07阅读1936
  • (荐)跟我学SpringMVC目录汇总贴、PDF下载、源码下载2014-06-13阅读5802
  • 对Spring IoC容器实现的结构分析2013-04-26阅读1166
  • spring发布和接收定制的事件(spring事件传播)2012-12-26阅读23962
  • Spring MVC 入门教程2012-07-26阅读2641
  • (精)Spring_AOP原理及拦截器2014-11-18阅读2066
  • 基于Spring可扩展Schema提供自定义配置支持2014-07-31阅读688
  • Spring Batch2013-08-23阅读3948
  • Eclipse插件开发2013-02-18阅读1178
  • (精)Spring MVC 3 深入总结2012-07-26阅读2027
更多文章

参考知识库

大型网站架构知识库

2236关注|532收录

Java EE知识库

2141关注|625收录

MySQL知识库

9344关注|1396收录

Java SE知识库

10295关注|454收录

Java Web知识库

10617关注|1116收录

更多资料请参考:
猜你在找
spring3.2入门到大神(备java基础、jsp、servlet,javaee精髓)
Java分布式架构: Spring搭建RESTful web Service
Javascript面向对象特效&框架封装实战
java反射和注解开发(备java基础,javaee框架原理)
不求人,自己实现spring IOC框架
Spring框架原理一-- IOC与AOP
Spring IOC原理之Java反射机制
spring的IOC原理
关于Spring的IOC原理
SPRING原理解析-Ioc容器初始化
关闭
查看评论
89楼 liwentao10915天前 16:57发表 [回复] [引用][举报]
确实很赞,对sping ioc浅显易懂的诠释。。。赞赞赞,受教了。。。
88楼 github_代码如诗2017-03-05 12:24发表 [回复] [引用][举报]
非常非常好对spring的理解又加强了!
87楼 king_eagle20152017-01-23 16:28发表 [回复] [引用][举报]
描述的很形象呀!
86楼 qwerdfbsa2017-01-10 11:10发表 [回复] [引用][举报]
引用“zpf336”的评论:有一个问题:依赖的对象在合适的时间被注入,请问合适的时间具体是什么时间,是容器启动的时候还是别的什么...
(1).用户第一次通过getBean方法向IoC容索要Bean时,IoC容器触发依赖注入。

(2).当用户在Bean定义资源中为元素配置了lazy-init属性,即让容器在解析注册Bean定义时进行预实例化,触发依赖注入。
85楼 xuchengxi-java2016-12-30 22:10发表 [回复] [引用][举报]
有第二个例子的源码吗?
84楼 丁国华2016-12-19 10:26发表 [回复] [引用][举报]
mark
83楼 谁特么用了我的昵称2016-10-27 16:20发表 [回复] [引用][举报]
终于看到一篇高手用自己的理解写得通俗易懂的关于spring的博客了,搜了那么多,到处都是从API上抄来的。赞*32
82楼 小小i程序员2016-09-19 16:22发表 [回复] [引用][举报]
为啥代码要重发贴两遍
81楼 JinnyDing2016-06-09 19:22发表 [回复] [引用][举报]
引用的那个例子,实在不怎么样!
80楼 默默之情2016-04-14 17:24发表 [回复] [引用][举报]
就是利用反射完成依赖注入,来实现控制反转的思想?
79楼 cqxsyt2016-04-11 15:48发表 [回复] [引用][举报]
说得太简单了,但实际上比这个深奥多了,资源定位,资源验证解析,资源加载这个才是IoC的核心,理解了getBean与Refresh方法发生的事情才算理解了IoC
78楼 欺骗性的伪装2016-04-07 13:30发表 [回复] [引用][举报]
就应该这样说,专业的术语我们也听不懂..就得打比方..
77楼 shihengli20102016-03-23 10:14发表 [回复] [引用][举报]
赞 !!!!
群主能转载么
76楼 孟东辉2016-03-06 20:57发表 [回复] [引用][举报]
从概念上感觉有了深的理解。文章很不错。谢谢。
75楼 lIo012016-03-01 12:04发表 [回复] [引用][举报]
什么叫如果还不明白放弃JAVA?
你的意思是给那些新手死路?你以为自己会了点东西就厉害了?
我告诉你,还远着呢,千万别以为自己学会了,
否则你将必死无疑!!!!!!!!!!
Re: callmezx2016-03-02 10:55发表 [回复] [引用][举报]
回复lIo01:说的很对
74楼 灼灼绽放2016-02-29 16:43发表 [回复] [引用][举报]
理论和实践相结合,谢谢分享!
73楼 dt71339062016-02-23 10:06发表 [回复] [引用][举报]
要是所有的技术文章都能写成这样就好了,大赞楼主
72楼 孤客_2016-02-02 18:02发表 [回复] [引用][举报]
源码部分说错了吧,我最近看spring源码,看的是4.2.4的。你看的是哪个版本?而且依赖注入即使是最早的版本也不是这么简单啊
Re: lIo012016-03-01 11:27发表 [回复] [引用][举报]
回复孤客_:源码部分说的确实有点问题,容易误导新手
71楼 xinxincement2016-01-04 14:20发表 [回复] [引用][举报]
就应该这样讲解,很多书都把人给说糊涂了,
Ioc就是运行时加载实例(通过反射)而已,
AOP就是动态代理而已
不知道这样理解对不对?
70楼 qq_172058932015-12-24 18:05发表 [回复] [引用][举报]
见识了。
69楼 笑破苍穹2015-12-14 15:29发表 [回复] [引用][举报]
写的很好,不过对整体调用关系不太明白
68楼 SharkYu19912015-12-04 18:05发表 [回复] [引用][举报]
通俗易懂,好文章!
67楼 kernel2882015-11-16 17:16发表 [回复] [引用][举报]
这次我居然看懂了一大半。:)
66楼 润夜2015-11-10 21:47发表 [回复] [引用][举报]
好腻害。通俗易懂。
65楼 卜居易2015-10-18 22:21发表 [回复] [引用][举报]
Good job! It is a great help for me.
64楼 请叫我星仔2015-10-17 00:33发表 [回复] [引用][举报]
写的真心不错,简单通俗,IOC和DI完全分开了。
63楼 yzwssa2015-10-13 14:11发表 [回复] [引用][举报]
这解析的很透彻 谢谢!
62楼 baixue58386542015-09-20 17:41发表 [回复] [引用][举报]
太棒了 易懂 谢过了
61楼 dongkui07122015-09-18 09:20发表 [回复] [引用][举报]
终于理解了,感谢!!!
60楼 lashenging2015-09-16 22:18发表 [回复] [引用][举报]
点赞
59楼 豆瓣酱儿2015-08-17 09:38发表 [回复] [引用][举报]
不错,就是看不懂代码
58楼 owl_9212015-08-05 13:53发表 [回复] [引用][举报]
写得真好。把原理完全说清楚了
57楼 laudukang2015-07-24 00:17发表 [回复] [引用][举报]
感谢分享!2015年7月24日00:17:32
56楼 RabonDai2015-07-07 10:41发表 [回复] [引用][举报]
刚开始学习,直到看到了楼主的这篇文章才深刻理解了IOC和DI,感谢楼主,希望能写写AOP的入门总结。
55楼 dev_test2015-06-24 18:25发表 [回复] [引用][举报]
很好的文章!
54楼 思灵月2015-06-23 22:12发表 [回复] [引用][举报]
写得很详细很精彩,深深的感激!
53楼 srhlwdamon2015-06-11 14:57发表 [回复] [引用][举报]
嗯嗯 好文 解释的很形象~~ 让我对ioc的理解加深很多啊~ 大谢~
52楼 三 丰2015-05-28 10:45发表 [回复] [引用][举报]
有一个问题:依赖的对象在合适的时间被注入,请问合适的时间具体是什么时间,是容器启动的时候还是别的什么时候。有谁比较清楚的帮我解决一下这个问题
51楼 huangdamei2015-05-26 22:12发表 [回复] [引用][举报]
非常好
50楼 羽落风起2015-04-27 11:53发表 [回复] [引用][举报]
谢谢楼主,很有用,奋斗中。
49楼 zhuojiajin2015-04-20 17:29发表 [回复] [引用][举报]
生活阅历丰富,知识理解深刻。关键是融会贯通!
48楼 zhuojiajin2015-04-20 17:28发表 [回复] [引用][举报]
深藏功与名a!
47楼 飞天PANDA2015-04-16 15:58发表 [回复] [引用][举报]
不错!刚下了spring In Action中文版,先学习一下~!
46楼 qq_246210932015-04-14 23:46发表 [回复] [引用][举报]
学习了, 写得很不错
45楼 lewis_hope2015-04-12 21:17发表 [回复] [引用][举报]
不错
44楼 xiaowan10072015-04-12 20:25发表 [回复] [引用][举报]
是啊很形象 源码太多了
43楼 张小鸟菜菜2015-04-05 04:28发表 [回复] [引用][举报]
setFieldValue(clazzParameterType.getName(), value, m,
obj); 这个函数具体是怎么执行的啊?求楼主大人解释一下!
Re: standJK2016-03-03 11:21发表 [回复] [引用][举报]
回复张小鸟菜菜:应该是楼主封装的反射方法
42楼 hyde122015-03-26 21:48发表 [回复] [引用][举报]
卧槽 卤煮 我特地登录上来感谢你
41楼 qq_266489612015-03-17 17:42发表 [回复] [引用][举报]
...
40楼 zhikun_9112015-03-16 21:35发表 [回复] [引用][举报]
好文章!例子举得特别的生动!代码也很完美!点32个赞!
39楼 tunxizxh2015-03-06 17:11发表 [回复] [引用][举报]
牛B就是牛B
38楼 韩艳坤2015-03-06 14:28发表 [回复] [引用][举报]
好文章
37楼 xiaoxiaomo_com2015-03-03 15:48发表 [回复] [引用][举报]
真心不错啊
36楼 龙svse2015-02-26 10:10发表 [回复] [引用][举报]
呜呜,我要放弃吗
35楼 王帅201602222015-02-04 13:54发表 [回复] [引用][举报]
很好,很好~
34楼 影子传说yi2015-01-13 16:15发表 [回复] [引用][举报]
没那么麻烦,现在都用注解了
Re: Thehope04142015-03-10 20:42发表 [回复] [引用][举报]
回复影子传说yi:注解也是一样用的这几段代码的原理啊。所谓注解只是不用你再去xml文件中配置bean而依靠注解直接标记简化点而已。这里面的控制反转和依赖注入一点都没变,用注解也不会改变核心原理,是两回事。
Re: suanqi66602016-10-25 11:09发表 [回复] [引用][举报]
回复Thehope0414:
Re: WangStudent2015-04-22 17:09发表 [回复] [引用][举报]
回复Thehope0414:说的对,挺好的
Re: suanqi66602016-10-25 11:08发表 [回复] [引用][举报]
回复WangStudent:
33楼 颖杰2014-11-05 14:45发表 [回复] [引用][举报]
很好的原理性知识,学习了。
32楼 大数据小白2014-10-10 16:57发表 [回复] [引用][举报]
哥们,总结得太好了,就是好,感谢啊,学习了。
31楼 guixiaobin2014-09-28 20:19发表 [回复] [引用][举报]
很清楚,受教了。
30楼 liju1234562014-09-24 15:13发表 [回复] [引用][举报]
学习了。谢谢
29楼 cwk0012262014-09-17 11:36发表 [回复] [引用][举报]
写的真的很好哈
28楼 kookob2014-09-15 22:18发表 [回复] [引用][举报]
学习了,感谢分享
27楼 luzhe30141512014-08-06 10:17发表 [回复] [引用][举报]
赞一个~写的不错!
26楼 mika_sleeping2014-07-29 10:59发表 [回复] [引用][举报]
写得太好了!!!!怒赞!!
25楼 wyb6570139892014-06-24 23:36发表 [回复] [引用][举报]
核心思想就这么个道理,可是spring中的实现就复杂的不是 一点了
24楼 pengjinyi2014-03-22 10:46发表 [回复] [引用][举报]
java还可以做android开发。
23楼 u0110643372014-02-27 09:52发表 [回复] [引用][举报]
不错不错,容易理解
22楼 erinfan_QQ2014-02-01 11:43发表 [回复] [引用][举报]
学习了!浅显易懂!好文章!
21楼 anlun1233212013-06-26 09:27发表 [回复] [引用][举报]
冰山一角
20楼 kgdtaje2013-05-18 16:03发表 [回复] [引用][举报]
这是我的QQ413419407。拜托了
19楼 kgdtaje2013-05-18 16:01发表 [回复] [引用][举报]
楼主,能不能给我提供这部分代码吗?我非常想看看这方面。
18楼 Java学习者2013-04-01 15:04发表 [回复] [引用][举报]
Java轻量级Ioc容器,100%国人原创,真诚推荐
http://dl.vmall.com/c0u7lix55w

Java开发的好帮手,省时省力,方便快捷,真诚推荐
http://dl.vmall.com/c0robhjzwp
Re: lIo012016-03-01 11:15发表 [回复] [引用][举报]
回复Java学习者:你傻逼吧,
17楼 Java学习者2013-03-27 16:20发表 [回复] [引用][举报]
这个代码生成器中包含一个国人100% 自创Ioc工具.

http://dl.vmall.com/c0kjnasnu0
16楼 qq1906791522013-01-08 01:38发表 [回复] [引用][举报]
嗯!不错!!!!谢谢!LZ!
15楼 程序员bsoft2012-12-07 14:18发表 [回复] [引用][举报]
for (Method m : ms) {
if (m.getName().equals(methodName)) {
if (m.getParameterTypes().length == 1) {
Class clazzParameterType = m.getParameterTypes()[0];
setFieldValue(clazzParameterType.getName(), value, m,
obj);
break;
}
}
的setFieldValue报错啊,楼主怎么看?
14楼 潇潇08152012-07-16 10:08发表 [回复] [引用][举报]
顶楼主。。不懂的可以放弃JAVA了
Re: lIo012016-03-01 12:08发表 [回复] [引用][举报]
回复潇潇0815:SB
13楼 zqaha2012-07-11 09:08发表 [回复] [引用][举报]
刚开始学习Spring,有点不明白,请问是直接看3.0呢还是先看3.0以下的比较好呢,网上好多视频教程都是2.x的
Re: 春色恼人看不得2014-11-02 21:28发表 [回复] [引用][举报]
回复zqaha:貌似都差不多吧。。 3.0也是在2.x上面的基础加东西啊。。 基本的原理是一样的哦。
12楼 mbztic2012-05-17 16:07发表 [回复] [引用][举报]
不错 ,
11楼 yezhuzhe2012-04-16 14:10发表 [回复] [引用][举报]
收藏了ioc算是明白点原理了。谢谢哦。
10楼 混子20082012-04-05 22:29发表 [回复] [引用][举报]
非常有帮助,多谢了。
9楼 ausky2012-02-15 08:54发表 [回复] [引用][举报]
学习了
8楼 cherish_yangt2012-02-06 11:16发表 [回复] [引用][举报]
支持楼主对我们的帮助!
受教了....
7楼 mrxu21312011-08-29 10:45发表 [回复] [引用][举报]
好文章!支持楼主!
6楼 JAVA__lover2011-05-13 09:26发表 [回复] [引用][举报]
写的很好,谢谢楼主
5楼 超级谷歌2011-03-29 20:22发表 [回复] [引用][举报]
谢谢各位支持
4楼 zrq4062523242011-03-28 11:11发表 [回复] [引用][举报]
[e03][e03][e03]
3楼 caesarx2011-03-15 11:07发表 [回复] [引用][举报]
[e03]
2楼 了然吾风2011-02-18 10:26发表 [回复] [引用][举报]
[e01]
1楼 匿名用户2010-07-12 14:33发表 [回复] [引用][举报]
这样说多清楚呀![e03]
Re: 大JASON2014-12-02 09:06发表 [回复] [引用][举报]
回复匿名用户:
发表评论
  • 用 户 名:
  • 评论内容:
  • HTML/XML objective-c Delphi Ruby PHP C# C++ JavaScript Visual Basic Python Java CSS SQL 其它
      
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap
    个人资料
    spring ioc di 原理解析_第1张图片
    超级谷歌
    1
    • 访问:1882607次
    • 积分:18533
    • 等级:
    • 排名:第371名
    • 原创:279篇
    • 转载:204篇
    • 译文:3篇
    • 评论:404条
    文章分类
  • JAVA(145)
  • 架构和设计模式(60)
  • 开源技术(如Struts/spring/Hibernate等)(71)
  • 云计算/物联网(3)
  • 搜索引擎与数据挖掘(3)
  • 集群&负载均衡(4)
  • 数据库/NoSql(44)
  • API&开放平台(1)
  • Linux/Uinx等操作系统(6)
  • 工作流&业务规则&策略&推理(5)
  • 经典文章(22)
  • 开源应用系统(12)
  • 大数据分析(7)
  • 系统优化(11)
  • Web开发技术相关(49)
  • WebService(6)
  • javaScript(19)
  • 软件工程管理(25)
  • 中间件&WOA&SAP&SOA(7)
  • XML(5)
  • 安全(4)
  • 非技术文章(18)
  • 所见即所得(2)
  • IT其他技术(14)
  • 管理知识(2)
  • 电子商务(3)
  • 商业智能(0)
  • 移动开发(5)
  • SCM+测试(14)
  • SSO(3)
  • 日语(7)
  • 异常(4)
  • 算法(1)
    文章存档
  • 2015年12月(7)
  • 2015年09月(1)
  • 2015年08月(1)
  • 2015年02月(2)
  • 2015年01月(11)
  • 2014年12月(5)
  • 2014年11月(3)
  • 2014年09月(6)
  • 2014年08月(10)
  • 2014年07月(7)
  • 2014年06月(1)
  • 2014年05月(8)
  • 2014年04月(7)
  • 2014年03月(4)
  • 2014年02月(2)
  • 2013年12月(2)
  • 2013年11月(6)
  • 2013年10月(3)
  • 2013年09月(10)
  • 2013年08月(7)
  • 2013年07月(4)
  • 2013年06月(5)
  • 2013年05月(6)
  • 2013年04月(4)
  • 2013年03月(6)
  • 2013年02月(6)
  • 2013年01月(8)
  • 2012年12月(8)
  • 2012年11月(10)
  • 2012年10月(4)
  • 2012年08月(2)
  • 2012年07月(11)
  • 2012年06月(2)
  • 2012年05月(21)
  • 2012年04月(2)
  • 2012年03月(8)
  • 2012年02月(9)
  • 2012年01月(9)
  • 2011年12月(13)
  • 2011年11月(6)
  • 2011年10月(3)
  • 2011年09月(4)
  • 2011年08月(9)
  • 2011年07月(6)
  • 2011年05月(5)
  • 2011年03月(2)
  • 2011年02月(7)
  • 2011年01月(1)
  • 2010年11月(1)
  • 2010年10月(1)
  • 2010年08月(4)
  • 2010年07月(1)
  • 2010年04月(1)
  • 2010年03月(1)
  • 2009年12月(11)
  • 2009年10月(5)
  • 2009年08月(12)
  • 2009年07月(6)
  • 2009年03月(3)
  • 2009年02月(1)
  • 2009年01月(7)
  • 2008年12月(4)
  • 2008年11月(1)
  • 2008年08月(1)
  • 2008年05月(2)
  • 2008年04月(2)
  • 2008年02月(7)
  • 2008年01月(7)
  • 2007年12月(4)
  • 2007年11月(2)
  • 2007年09月(1)
  • 2007年08月(3)
  • 2007年03月(1)
  • 2007年01月(2)
  • 2006年12月(20)
  • 2006年11月(32)
  • 2006年10月(19)
  • 2006年09月(13)
  • 2006年08月(11)
  • 2006年07月(5)
  • 2006年06月(11)
  • 2006年05月(8)
  • 展开
    阅读排行
  • spring ioc原理(看完后大家可以自己写一个spring)(192430)
  • Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别(64497)
  • Serializable java序列化(58834)
  • 在Eclipse中使用Maven 2.x指南(38199)
  • Hadoop家族学习路线图(34351)
  • seajs使用教程指南(32758)
  • jquery插件--ajaxfileupload.js上传文件原理分析(28956)
  • Java多线程间的通信(26097)
  • Java 单例模式探讨(24443)
  • Maven 2.0:编译、测试、部署、运行 和 POM.XML(24114)
    评论排行
  • spring ioc原理(看完后大家可以自己写一个spring)(102)
  • Spring Quartz动态配置时间(24)
  • Java 单例模式探讨(15)
  • Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别(13)
  • JAVA访问控制符(写给初学者的)(11)
  • Serializable java序列化(10)
  • 用消息队列和消息应用状态表来消除分布式事务(10)
  • WebService cxf视频教程(8)
  • Java功底之Reference(8)
  • (精)JAVA线程池原理以及几种线程池类型介绍(8)
    推荐文章
    • * 一个想法照进现实-《IT连》创业项目:三天的风投对接活动内幕分享
    • * 神兵利器Dagger2
    • * 从CAP 到编程语言的猜想
    • * iWatch开发:WatchOS 消息推送教程
    • * iOS狂暴之路---iOS中应用的数据存储方式解析
    最新评论
  • spring ioc原理(看完后大家可以自己写一个spring)

    liwentao1091:确实很赞,对sping ioc浅显易懂的诠释。。。赞赞赞,受教了。。。

  • spring ioc原理(看完后大家可以自己写一个spring)

    github_代码如诗:非常非常好对spring的理解又加强了!

  • jquery插件--ajaxfileupload.js上传文件原理分析

    qq_27433185:注意,这里一定要有name值 感谢指点迷津

  • jquery插件--ajaxfileupload.js上传文件原理分析

    qq_27433185:注意,这里一定要有name值 感谢指点迷津

  • 什么是元数据 (MetaData)

    DV2:楼主问下,你最后的这本书叫啥名字可否说下

  • JForum3

    云浩舟:你好 能否讲解下jforum3的安装呢 我这边安装完了报错

  • 关于进程与线程的简单解释

    DoCted:强

  • WebService cxf视频教程

    NQSSBWW:无效链接

  • 常见规则引擎技术

    泽东我是少奇:@qq_16911027:按照作者的意思,Drools中的Guvnor模块应该能实现你描述的功能,正...

  • spring ioc原理(看完后大家可以自己写一个spring)

    king_eagle2015:描述的很形象呀!

    便民服务
    • 火车时刻表查询
    • 天气预报
    • 在线翻译(中日英)
    • IP地址、手机号码、身份证查询
    • 万年历查询
    • 中日英在线翻译 (RSS)
    • 酒店信息查询
    • 航班时刻查询系统
    管理知识网站
    • 世界经理人网站
    • MBA智库
    免费资源
    • 1G网络硬盘(还有大量免费视频)
    娱乐频道
    • 天涯社区BBS
    • 拂晓雅阁(超人气BBS)
    资源中心
    • 中国it实验室
    • IBM中国
    • 中国教育学习网
    • 沪江网( 最牛的语言学习网)
    • AJax技术论坛
    • 教育人生网
    • 传智播客
    • 乐知学堂
    • 天极网
    • 开源中国社区 (RSS)
    • java开发大全
    • iteye社区
    • 北风网
src="about:blank" frameborder="0" scrolling="no" style="z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%;background:transparent">
您有 49条新通知

提问

您的问题将会被发布在“技术问答”频道 ×
该问题已存在,请勿重复提问
src="http://ask.csdn.net/upload.html">
插入图片
| | | | | |
  
0 0 0:0
推荐标签:
我要悬赏
取消 发布
可能存在类似的问题:
我想提一个新问题

保存代码片

整理和分享保存的代码片,请访问代码笔记
  • *标题
  • *描述
  •  标签
    springx iocx stringx hashmapx objectx beanx
  • 你可能感兴趣的:(框架,spring)