[b]1 spring容器的功能:[/b]
是管理bean,和维护bean之间的关系。
我一般把ApplicationContext理解为一个重HashMap。
[b]2 spring的运行原理:[/b]
假设脑海中已经存在了这样的一个spring配置文件,包含了很多bean。
配置文件里包含这样两个bean
<bean id="userService" class="com.cn.UserService">
<property name="userName" value="张三"/>
<property name="leadService" ref="com.cn.LeadService"/>
</bean>
<bean id="leadService" ref="com.cn.LeadService">
<property name="leadName" value="李四"/>
</bean>
在内存中可以这么理解:
内存 ApplicationContext容器
id value
userService (地址:0x123) com.cn.UserService(userName,leadService)
leadService (地址:0x234) com.cn.LeadService(leadName)
容器可以通过id获取对象,对象之间也可以相互引用,是不是和Map类似呢。
[b]3 可以通过反射和dom4j理解下内部实现机制[/b]
userService=Class.forName("com.cn.UserService");
[b]4 现在来理解IOC和DI应该就变得容易了[/b]
IOC 即inversion of control 控制反转,即将控制的权利转移给了容器,由容器去负责管理bean和bean之间的关系。
DI 依赖注入,看一下上面的bean的配置,会发现在容器注入的bean,bean里注入的属性和引用其它的bean,都交给了容器去管理。
有人说DI和IOC其实说的是一回事,只是不同的叫法。我有自己的理解。
IOC是是代码中控制bean对象的创建到容器管理对象生成的转移。
DI是bean之间的注入和引用关系的维护。
[b]题外:[/b]
像Action一般都定义为prototype,因为Action会封装实例变量,即有状态对象,非线程安全,而service,dao封装的变量是无状态的,线程安全,定义为singleton。(有兴趣的可以了解一下有状态和无状态对象)
有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 (action包含User这样的实例对象),可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的,(虽然service可以引用dao,但是dao都是没有状态信息的,也就相当于不变类)
另外,给正在学习spring框架的朋友一点建议,框架底层运用的技术基本上都是反射,HashMap。所以对反射和HashMap等技术先有深刻的理解,对学习框架原理会更有帮助。
是管理bean,和维护bean之间的关系。
我一般把ApplicationContext理解为一个重HashMap。
[b]2 spring的运行原理:[/b]
假设脑海中已经存在了这样的一个spring配置文件,包含了很多bean。
配置文件里包含这样两个bean
<bean id="userService" class="com.cn.UserService">
<property name="userName" value="张三"/>
<property name="leadService" ref="com.cn.LeadService"/>
</bean>
<bean id="leadService" ref="com.cn.LeadService">
<property name="leadName" value="李四"/>
</bean>
在内存中可以这么理解:
内存 ApplicationContext容器
id value
userService (地址:0x123) com.cn.UserService(userName,leadService)
leadService (地址:0x234) com.cn.LeadService(leadName)
容器可以通过id获取对象,对象之间也可以相互引用,是不是和Map类似呢。
[b]3 可以通过反射和dom4j理解下内部实现机制[/b]
userService=Class.forName("com.cn.UserService");
[b]4 现在来理解IOC和DI应该就变得容易了[/b]
IOC 即inversion of control 控制反转,即将控制的权利转移给了容器,由容器去负责管理bean和bean之间的关系。
DI 依赖注入,看一下上面的bean的配置,会发现在容器注入的bean,bean里注入的属性和引用其它的bean,都交给了容器去管理。
有人说DI和IOC其实说的是一回事,只是不同的叫法。我有自己的理解。
IOC是是代码中控制bean对象的创建到容器管理对象生成的转移。
DI是bean之间的注入和引用关系的维护。
[b]题外:[/b]
像Action一般都定义为prototype,因为Action会封装实例变量,即有状态对象,非线程安全,而service,dao封装的变量是无状态的,线程安全,定义为singleton。(有兴趣的可以了解一下有状态和无状态对象)
有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 (action包含User这样的实例对象),可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的,(虽然service可以引用dao,但是dao都是没有状态信息的,也就相当于不变类)
另外,给正在学习spring框架的朋友一点建议,框架底层运用的技术基本上都是反射,HashMap。所以对反射和HashMap等技术先有深刻的理解,对学习框架原理会更有帮助。