其实这个Spring
架构
核心的概念没有这么复杂,更不像有些书上描述的那样晦涩。
Java
程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关系业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。
这是我对Spring的IOC的体会。DI其实就是IOC的另外一种说法。DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:
控制的什么被反转了?就是:获得依赖对象的方式反转了。
如果对这一核心概念还不理解:这里引用一个叫
Bromon
的
blog
上找到的浅显易懂的答案:
IoC
与
DI
首先想说说
IoC
(
Inversion of Control
,控制倒转)。这是
spring
的核心,贯穿始终。所谓
IoC
,对于
spring
框架来说,就是由
spring
来负责控制对象的生命周期和
对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的
mm
,然后打听她们的兴趣爱
好、
qq
号、电话号、
ip
号、
iq
号
………
,想办法认识她们,投其所好送其所要,然后嘿嘿
……
这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传
统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己
new
一个,或者从
JNDI
中查询一个),使用完之后还要将对象销毁(比
如
Connection
等),对象始终会和其他的接口或类藕合起来。
那么
IoC
是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚
介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我
们的要求,提供一个
mm
,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控
制,而是有婚介这样一个类似容器的机构来控制。
Spring
所倡导的开发方式就是如此,所有的类都会在
spring
容器中登记,告诉
spring
你是个什
么东西,你需要什么东西,然后
spring
会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由
spring
来控制,也就是说控制对象生存周期的不再是引用它的对象,而是
spring
。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象
都被
spring
控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。
IoC
的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过
DI
(
Dependency Injection
,依赖注入)来实现的。比如对象
A
需要操作
数据库
,以前我们总是要在
A
中自己编写代码来获得一个
Connection
对象,有了
spring
我们就只需要告诉
spring
,
A
中需要一个
Connection
,至于这个
Connection
怎么构造,何时构造,
A
不需要知道。在系统
运行时,
spring
会在适当的时候制造一个
Connection
,然后像打针一样,注射到
A
当中,这样就完成了对各个对象之间关系的控制。
A
需要依赖
Connection
才能正常运行,而这个
Connection
是由
spring
注入到
A
中的,依赖注入的名字就这么来的。那么
DI
是如何实现的呢?
Java 1.3
之后一个重要特征是反射(
reflection
),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,
spring
就是通过反射来实现注入的。关于反射的相关资料请查阅
java doc
。
理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。
如果还不明白,放弃java吧!
下面来让大家了解一下Spring到底是怎么运行的。
-
public
static
void
main(String[] args) {
-
ApplicationContext context =
new
FileSystemXmlApplicationContext(
-
“applicationContext.xml”
);
-
Animal animal = (Animal) context.getBean(
“animal”
);
-
animal.say();
-
}
-
public
static
void
main(String[] args) { -
ApplicationContext context =
new
FileSystemXmlApplicationContext( -
“applicationContext.xml”
); -
Animal animal = (Animal) context.getBean(
“animal”
); - animal.say();
- }
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext(
"applicationContext.xml");
Animal animal = (Animal) context.getBean("animal");
animal.say();
}
这段代码你一定很熟悉吧,不过还是让我们分析一下它吧,首先是applicationContext.xml
-
<bean id=
“animal”
class
=
“phz.springframework.test.Cat”
>
-
<property name=
“name”
value=
“kitty”
/>
-
</bean>
-
<bean id=
“animal”
class
=
“phz.springframework.test.Cat”
> -
<property name=
“name”
value=
“kitty”
/> - </bean>
<bean id="animal" class="phz.springframework.test.Cat">
<property name="name" value="kitty" />
</bean>
他有一个类phz.springframework.test.Cat
-
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;
-
}
-
}
-
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; - }
- }
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接口
public interface Animal {
public void say();
}
很明显上面的代码输出I am kitty!
那么到底Spring是如何做到的呢?
接下来就让我们自己写个Spring 来看看Spring 到底是怎么运行的吧!
首先,我们定义一个Bean类,这个类用来存放一个Bean拥有的属性
-
/* Bean Id */
-
private
String id;
-
/* Bean Class */
-
private
String type;
-
/* Bean Property */
-
private
Map<String, Object> properties =
new
HashMap<String, Object>();
-
/* Bean Id */
-
private
String id; -
/* Bean Class */
-
private
String type; -
/* Bean Property */
-
private
Map<String, Object> properties =
new
HashMap<String, Object>();
/* Bean Id */
private String id;
/* Bean Class */
private String type;
/* Bean Property */
private Map<String, Object> properties = new HashMap<String, Object>();
一个Bean包括id,type,和Properties。
接下来Spring 就开始加载我们的配置文件了,将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,只有这样我们才能通过context.getBean(“animal”)这个方法获得Animal这个类。我们都知道Spirng可以注入基本类型,而且可以注入像List,Map这样的类型,接下来就让我们以Map为例看看Spring是怎么保存的吧
Map配置可以像下面的
-
<bean id=
“test”
class
=
“Test”
>
-
<property name=
“testMap”
>
-
<map>
-
<entry key=
“a”
>
-
<value>
1
</value>
-
</entry>
-
<entry key=
“b”
>
-
<value>
2
</value>
-
</entry>
-
</map>
-
</property>
-
</bean>
-
<bean id=
“test”
class
=
“Test”
> -
<property name=
“testMap”
> - <map>
-
<entry key=
“a”
> -
<value>
1
</value> - </entry>
-
<entry key=
“b”
> -
<value>
2
</value> - </entry>
- </map>
- </property>
- </bean>
<bean id="test" class="Test">
<property name="testMap">
<map>
<entry key="a">
<value>1</value>
</entry>
<entry key="b">
<value>2</value>
</entry>
</map>
</property>
</bean>
Spring是怎样保存上面的配置呢?,代码如下:
-
if
(beanProperty.element(
“map”
) !=
null
) {
-
Map<String, Object> propertiesMap =
new
HashMap<String, Object>();
-
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);
-
}
-
if
(beanProperty.element(
“map”
) !=
null
) { -
Map<String, Object> propertiesMap =
new
HashMap<String, Object>(); - 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);
- }
if (beanProperty.element("map") != null) {
Map<String, Object> propertiesMap = new HashMap<String, Object>();
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中的类属性注入到类中。让我们看看具体它是怎么做的吧。
首先实例化一个类,像这样
-
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;
-
}
-
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; - }
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;
}
接着它将这个类的依赖注入进去,像这样
-
public
static
void
setProperty(Object obj, String name, String value) {
-
Class<?
extends
Object> 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);
-
}
-
}
-
public
static
void
setProperty(Object obj, String name, String value) { -
Class<?
extends
Object> 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); - }
- }
public static void setProperty(Object obj, String name, String value) {
Class<? extends Object> 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注入到需要注入的类中,像这样,
-
if
(value
instanceof
Map) {
-
Iterator<?> entryIterator = ((Map<?, ?>) value).entrySet()
-
.iterator();
-
Map<String, Object> map =
new
HashMap<String, Object>();
-
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);
-
}
-
if
(value
instanceof
Map) { - Iterator<?> entryIterator = ((Map<?, ?>) value).entrySet()
- .iterator();
-
Map<String, Object> map =
new
HashMap<String, Object>(); -
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);
- }
if (value instanceof Map) {
Iterator<?> entryIterator = ((Map<?, ?>) value).entrySet()
.iterator();
Map<String, Object> map = new HashMap<String, Object>();
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
-
上一篇
JAVA MAIL JavaMail详解
-
下一篇
log4j配置指南
我的同类文章
http://blog.csdn.net
-
•
Spring AOP 实现原理
2015-12-09
-
•
Netty Channel 接口名词理解
2014-08-07
-
•
(荐)跟我学SpringMVC目录汇总贴、PDF下载、源码下载
2014-06-13
-
•
对Spring IoC容器实现的结构分析
2013-04-26
-
•
spring发布和接收定制的事件(spring事件传播)
2012-12-26
-
•
Spring MVC 入门教程
2012-07-26
-
•
(精)Spring_AOP原理及拦截器
2014-11-18
-
•
基于Spring可扩展Schema提供自定义配置支持
2014-07-31
-
•
Spring Batch
2013-08-23
-
•
Eclipse插件开发
2013-02-18
-
•
(精)Spring MVC 3 深入总结
2012-07-26
核心技术类目
全部主题
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
- 个人资料
-
- 访问: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)
- 推荐文章
- 最新评论
-
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
:描述的很形象呀!
- 免费资源
- 娱乐频道
49
条新通知
提问
该问题已存在,请勿重复提问
插入链接
插入图片
推荐标签:
保存代码片
整理和分享保存的代码片,请访问
代码笔记
-
*
标题
-
*
描述
-
标签
查看评论
89楼
-

-
确实很赞,对sping ioc浅显易懂的诠释。。。赞赞赞,受教了。。。
liwentao1091
5天前 16:57发表
[回复]
[引用]
[举报]
88楼
-

-
非常非常好对spring的理解又加强了!
github_代码如诗
2017-03-05 12:24发表
[回复]
[引用]
[举报]
87楼
-

-
描述的很形象呀!
king_eagle2015
2017-01-23 16:28发表
[回复]
[引用]
[举报]
86楼
-

-
qwerdfbsa
2017-01-10 11:10发表
[回复]
[引用]
[举报]
(1).用户第一次通过getBean方法向IoC容索要Bean时,IoC容器触发依赖注入。
(2).当用户在Bean定义资源中为<Bean>元素配置了lazy-init属性,即让容器在解析注册Bean定义时进行预实例化,触发依赖注入。
85楼
-

-
有第二个例子的源码吗?
xuchengxi-java
2016-12-30 22:10发表
[回复]
[引用]
[举报]
84楼
-

-
mark
丁国华
2016-12-19 10:26发表
[回复]
[引用]
[举报]
83楼
-

-
终于看到一篇高手用自己的理解写得通俗易懂的关于spring的博客了,搜了那么多,到处都是从API上抄来的。赞*32
谁特么用了我的昵称
2016-10-27 16:20发表
[回复]
[引用]
[举报]
82楼
-

-
为啥代码要重发贴两遍
小小i程序员
2016-09-19 16:22发表
[回复]
[引用]
[举报]
81楼
-

-
引用的那个例子,实在不怎么样!
JinnyDing
2016-06-09 19:22发表
[回复]
[引用]
[举报]
80楼
-

-
就是利用反射完成依赖注入,来实现控制反转的思想?
默默之情
2016-04-14 17:24发表
[回复]
[引用]
[举报]
79楼
-

-
说得太简单了,但实际上比这个深奥多了,资源定位,资源验证解析,资源加载这个才是IoC的核心,理解了getBean与Refresh方法发生的事情才算理解了IoC
cqxsyt
2016-04-11 15:48发表
[回复]
[引用]
[举报]
78楼
-

-
就应该这样说,专业的术语我们也听不懂..就得打比方..
欺骗性的伪装
2016-04-07 13:30发表
[回复]
[引用]
[举报]
77楼
-

-
赞 !!!!
shihengli2010
2016-03-23 10:14发表
[回复]
[引用]
[举报]
群主能转载么
76楼
-

-
从概念上感觉有了深的理解。文章很不错。谢谢。
孟东辉
2016-03-06 20:57发表
[回复]
[引用]
[举报]
75楼
-

-
什么叫如果还不明白放弃JAVA?
lIo01
2016-03-01 12:04发表
[回复]
[引用]
[举报]
你的意思是给那些新手死路?你以为自己会了点东西就厉害了?
我告诉你,还远着呢,千万别以为自己学会了,
否则你将必死无疑!!!!!!!!!!
Re:
-

-
回复lIo01:说的很对
callmezx
2016-03-02 10:55发表
[回复]
[引用]
[举报]
74楼
-

-
理论和实践相结合,谢谢分享!
灼灼绽放
2016-02-29 16:43发表
[回复]
[引用]
[举报]
73楼
-

-
要是所有的技术文章都能写成这样就好了,大赞楼主
dt7133906
2016-02-23 10:06发表
[回复]
[引用]
[举报]
72楼
-

-
源码部分说错了吧,我最近看spring源码,看的是4.2.4的。你看的是哪个版本?而且依赖注入即使是最早的版本也不是这么简单啊
孤客_
2016-02-02 18:02发表
[回复]
[引用]
[举报]
Re:
-

-
回复孤客_:源码部分说的确实有点问题,容易误导新手
lIo01
2016-03-01 11:27发表
[回复]
[引用]
[举报]
71楼
-

-
就应该这样讲解,很多书都把人给说糊涂了,
xinxincement
2016-01-04 14:20发表
[回复]
[引用]
[举报]
Ioc就是运行时加载实例(通过反射)而已,
AOP就是动态代理而已
不知道这样理解对不对?
70楼
-

-
见识了。
qq_17205893
2015-12-24 18:05发表
[回复]
[引用]
[举报]
69楼
-

-
写的很好,不过对整体调用关系不太明白
笑破苍穹
2015-12-14 15:29发表
[回复]
[引用]
[举报]
68楼
-

-
通俗易懂,好文章!
SharkYu1991
2015-12-04 18:05发表
[回复]
[引用]
[举报]
67楼
-

-
这次我居然看懂了一大半。:)
kernel288
2015-11-16 17:16发表
[回复]
[引用]
[举报]
66楼
-

-
好腻害。通俗易懂。
润夜
2015-11-10 21:47发表
[回复]
[引用]
[举报]
65楼
-

-
Good job! It is a great help for me.
卜居易
2015-10-18 22:21发表
[回复]
[引用]
[举报]
64楼
-

-
写的真心不错,简单通俗,IOC和DI完全分开了。
请叫我星仔
2015-10-17 00:33发表
[回复]
[引用]
[举报]
63楼
-

-
这解析的很透彻 谢谢!
yzwssa
2015-10-13 14:11发表
[回复]
[引用]
[举报]
62楼
-

-
太棒了 易懂 谢过了
baixue5838654
2015-09-20 17:41发表
[回复]
[引用]
[举报]
61楼
-

-
终于理解了,感谢!!!
dongkui0712
2015-09-18 09:20发表
[回复]
[引用]
[举报]
60楼
-

-
点赞
lashenging
2015-09-16 22:18发表
[回复]
[引用]
[举报]
59楼
-

-
不错,就是看不懂代码
豆瓣酱儿
2015-08-17 09:38发表
[回复]
[引用]
[举报]
58楼
-

-
写得真好。把原理完全说清楚了
owl_921
2015-08-05 13:53发表
[回复]
[引用]
[举报]
57楼
-

-
感谢分享!2015年7月24日00:17:32
laudukang
2015-07-24 00:17发表
[回复]
[引用]
[举报]
56楼
-

-
刚开始学习,直到看到了楼主的这篇文章才深刻理解了IOC和DI,感谢楼主,希望能写写AOP的入门总结。
RabonDai
2015-07-07 10:41发表
[回复]
[引用]
[举报]
55楼
-

-
很好的文章!
dev_test
2015-06-24 18:25发表
[回复]
[引用]
[举报]
54楼
-

-
写得很详细很精彩,深深的感激!
思灵月
2015-06-23 22:12发表
[回复]
[引用]
[举报]
53楼
-

-
嗯嗯 好文 解释的很形象~~ 让我对ioc的理解加深很多啊~ 大谢~
srhlwdamon
2015-06-11 14:57发表
[回复]
[引用]
[举报]
52楼
-

-
有一个问题:依赖的对象在合适的时间被注入,请问合适的时间具体是什么时间,是容器启动的时候还是别的什么时候。有谁比较清楚的帮我解决一下这个问题
三 丰
2015-05-28 10:45发表
[回复]
[引用]
[举报]
51楼
-

-
非常好
huangdamei
2015-05-26 22:12发表
[回复]
[引用]
[举报]
50楼
-

-
谢谢楼主,很有用,奋斗中。
羽落风起
2015-04-27 11:53发表
[回复]
[引用]
[举报]
49楼
-

-
生活阅历丰富,知识理解深刻。关键是融会贯通!
zhuojiajin
2015-04-20 17:29发表
[回复]
[引用]
[举报]
48楼
-

-
深藏功与名a!
zhuojiajin
2015-04-20 17:28发表
[回复]
[引用]
[举报]
47楼
-

-
不错!刚下了spring In Action中文版,先学习一下~!
飞天PANDA
2015-04-16 15:58发表
[回复]
[引用]
[举报]
46楼
-

-
学习了, 写得很不错
qq_24621093
2015-04-14 23:46发表
[回复]
[引用]
[举报]
45楼
-

-
不错
lewis_hope
2015-04-12 21:17发表
[回复]
[引用]
[举报]
44楼
-

-
是啊很形象 源码太多了
xiaowan1007
2015-04-12 20:25发表
[回复]
[引用]
[举报]
43楼
-

-
setFieldValue(clazzParameterType.getName(), value, m,
张小鸟菜菜
2015-04-05 04:28发表
[回复]
[引用]
[举报]
obj); 这个函数具体是怎么执行的啊?求楼主大人解释一下!
Re:
-

-
回复张小鸟菜菜:应该是楼主封装的反射方法
standJK
2016-03-03 11:21发表
[回复]
[引用]
[举报]
42楼
-

-
卧槽 卤煮 我特地登录上来感谢你
hyde12
2015-03-26 21:48发表
[回复]
[引用]
[举报]
41楼
-

-
…
qq_26648961
2015-03-17 17:42发表
[回复]
[引用]
[举报]
40楼
-

-
好文章!例子举得特别的生动!代码也很完美!点32个赞!
zhikun_911
2015-03-16 21:35发表
[回复]
[引用]
[举报]
39楼
-

-
牛B就是牛B
tunxizxh
2015-03-06 17:11发表
[回复]
[引用]
[举报]
38楼
-

-
好文章
韩艳坤
2015-03-06 14:28发表
[回复]
[引用]
[举报]
37楼
-

-
真心不错啊
xiaoxiaomo_com
2015-03-03 15:48发表
[回复]
[引用]
[举报]
36楼
-

-
呜呜,我要放弃吗
龙svse
2015-02-26 10:10发表
[回复]
[引用]
[举报]
35楼
-

-
很好,很好~
王帅20160222
2015-02-04 13:54发表
[回复]
[引用]
[举报]
34楼
-

-
没那么麻烦,现在都用注解了
影子传说yi
2015-01-13 16:15发表
[回复]
[引用]
[举报]
Re:
-

-
回复影子传说yi:注解也是一样用的这几段代码的原理啊。所谓注解只是不用你再去xml文件中配置bean而依靠注解直接标记简化点而已。这里面的控制反转和依赖注入一点都没变,用注解也不会改变核心原理,是两回事。
Thehope0414
2015-03-10 20:42发表
[回复]
[引用]
[举报]
Re:
-

-
回复Thehope0414:
suanqi6660
2016-10-25 11:09发表
[回复]
[引用]
[举报]
Re:
-

-
回复Thehope0414:说的对,挺好的
WangStudent
2015-04-22 17:09发表
[回复]
[引用]
[举报]
Re:
-

-
回复WangStudent:
suanqi6660
2016-10-25 11:08发表
[回复]
[引用]
[举报]
33楼
-

-
很好的原理性知识,学习了。
颖杰
2014-11-05 14:45发表
[回复]
[引用]
[举报]
32楼
-

-
哥们,总结得太好了,就是好,感谢啊,学习了。
大数据小白
2014-10-10 16:57发表
[回复]
[引用]
[举报]
31楼
-

-
很清楚,受教了。
guixiaobin
2014-09-28 20:19发表
[回复]
[引用]
[举报]
30楼
-

-
学习了。谢谢
liju123456
2014-09-24 15:13发表
[回复]
[引用]
[举报]
29楼
-

-
写的真的很好哈
cwk001226
2014-09-17 11:36发表
[回复]
[引用]
[举报]
28楼
-

-
学习了,感谢分享
kookob
2014-09-15 22:18发表
[回复]
[引用]
[举报]
27楼
-

-
赞一个~写的不错!
luzhe3014151
2014-08-06 10:17发表
[回复]
[引用]
[举报]
26楼
-

-
写得太好了!!!!怒赞!!
mika_sleeping
2014-07-29 10:59发表
[回复]
[引用]
[举报]
25楼
-

-
核心思想就这么个道理,可是spring中的实现就复杂的不是 一点了
wyb657013989
2014-06-24 23:36发表
[回复]
[引用]
[举报]
24楼
-

-
java还可以做android开发。
pengjinyi
2014-03-22 10:46发表
[回复]
[引用]
[举报]
23楼
-

-
不错不错,容易理解
u011064337
2014-02-27 09:52发表
[回复]
[引用]
[举报]
22楼
-

-
学习了!浅显易懂!好文章!
erinfan_QQ
2014-02-01 11:43发表
[回复]
[引用]
[举报]
21楼
-

-
冰山一角
anlun123321
2013-06-26 09:27发表
[回复]
[引用]
[举报]
20楼
-

-
这是我的QQ413419407。拜托了
kgdtaje
2013-05-18 16:03发表
[回复]
[引用]
[举报]
19楼
-

-
楼主,能不能给我提供这部分代码吗?我非常想看看这方面。
kgdtaje
2013-05-18 16:01发表
[回复]
[引用]
[举报]
18楼
-

-
Java轻量级Ioc容器,100%国人原创,真诚推荐
Java学习者
2013-04-01 15:04发表
[回复]
[引用]
[举报]
http://dl.vmall.com/c0u7lix55w
Java开发的好帮手,省时省力,方便快捷,真诚推荐
http://dl.vmall.com/c0robhjzwp
Re:
-

-
回复Java学习者:你傻逼吧,
lIo01
2016-03-01 11:15发表
[回复]
[引用]
[举报]
17楼
-

-
这个代码生成器中包含一个国人100% 自创Ioc工具.
Java学习者
2013-03-27 16:20发表
[回复]
[引用]
[举报]
http://dl.vmall.com/c0kjnasnu0
16楼
-

-
嗯!不错!!!!谢谢!LZ!
qq190679152
2013-01-08 01:38发表
[回复]
[引用]
[举报]
15楼
-

-
for (Method m : ms) {
程序员bsoft
2012-12-07 14:18发表
[回复]
[引用]
[举报]
if (m.getName().equals(methodName)) {
if (m.getParameterTypes().length == 1) {
Class<?> clazzParameterType = m.getParameterTypes()[0];
setFieldValue(clazzParameterType.getName(), value, m,
obj);
break;
}
}
的setFieldValue报错啊,楼主怎么看?
14楼
-

-
顶楼主。。不懂的可以放弃JAVA了
潇潇0815
2012-07-16 10:08发表
[回复]
[引用]
[举报]
Re:
-

-
回复潇潇0815:SB
lIo01
2016-03-01 12:08发表
[回复]
[引用]
[举报]
13楼
-

-
刚开始学习Spring,有点不明白,请问是直接看3.0呢还是先看3.0以下的比较好呢,网上好多视频教程都是2.x的
zqaha
2012-07-11 09:08发表
[回复]
[引用]
[举报]
Re:
-

-
回复zqaha:貌似都差不多吧。。 3.0也是在2.x上面的基础加东西啊。。 基本的原理是一样的哦。
春色恼人看不得
2014-11-02 21:28发表
[回复]
[引用]
[举报]
12楼
-

-
不错 ,
mbztic
2012-05-17 16:07发表
[回复]
[引用]
[举报]
11楼
-

-
收藏了ioc算是明白点原理了。谢谢哦。
yezhuzhe
2012-04-16 14:10发表
[回复]
[引用]
[举报]
10楼
-

-
非常有帮助,多谢了。
混子2008
2012-04-05 22:29发表
[回复]
[引用]
[举报]
9楼
-

-
学习了
ausky
2012-02-15 08:54发表
[回复]
[引用]
[举报]
8楼
-

-
支持楼主对我们的帮助!
cherish_yangt
2012-02-06 11:16发表
[回复]
[引用]
[举报]
受教了….
7楼
-

-
好文章!支持楼主!
mrxu2131
2011-08-29 10:45发表
[回复]
[引用]
[举报]
6楼
-

-
写的很好,谢谢楼主
JAVA__lover
2011-05-13 09:26发表
[回复]
[引用]
[举报]
5楼
-

-
谢谢各位支持
超级谷歌
2011-03-29 20:22发表
[回复]
[引用]
[举报]
4楼
-

-
[e03][e03][e03]
zrq406252324
2011-03-28 11:11发表
[回复]
[引用]
[举报]
3楼
-

-
[e03]
caesarx
2011-03-15 11:07发表
[回复]
[引用]
[举报]
2楼
-

-
[e01]
了然吾风
2011-02-18 10:26发表
[回复]
[引用]
[举报]
1楼
-

-
这样说多清楚呀![e03]
匿名用户
2010-07-12 14:33发表
[回复]
[引用]
[举报]
Re:
-

-
回复匿名用户:
大JASON
2014-12-02 09:06发表
[回复]
[引用]
[举报]