SpringIoc实现机制——简析
原创需要明确的是,任何项目都已经消失了。Spring,还能做什么,那为什么Spring天气还会这么热吗?答案是Spring两个特点IoC与AOP,这里需要注意的是,它并不是Spring提出的AOP这个概念只能说是Spring非常好的实现。AOP特点。所以,这一次我们先来讨论一下。Spring IoC实施机制。
- IoC那是什么?
- IoC具体的实施机制是什么?
- 模拟Spring IoC的实现
- Spring源码中的IoC
- 参考资料
一、IoC那是什么?
IoC的e文叫做Inversion of Control,翻译为控制反转,然后 IoC你到底交了什么? 在面向对象的世界下思考,如果我们想要在对象中。A在中,操作对象B,那么A一定会坚持下去B引用(对象关系),然后才能操作。这样做的问题是 代码不够干净,代码维护成本高,耦合度高。
那么,Spring IoC为这个问题带来了解决方案,Spring对象之间的依赖关系在配置文件中管理,也就是说。Spring的DI——Dependency Injection(依赖注入),同时,任何对象都应该有一个地方来保存他,也就是。IoC容器,IoC集装箱里装着所有的Bean对象,则此Bean对象是真实的Object。Spring通过IoC容器,这些容器反过来操作这些Bean从而达到管理这些对象和对列的一些附加操作的目的。
然后回答前面的问题:
Q:IoC是什么?
A:IoC是控制反向器。
Q:IoC推翻了什么?
A:IoC反转对象的创建和依赖关系,Spring对象的创建和对象之间的依赖关系被移交。IoC集装箱要管理,管理的标准,就是轮廓。
二、IoC具体的实施机制是什么?
思考下,Spring由于对象的依赖关系是通过配置文件管理的,并且IoC这种关系是实现的。那么,这是否意味着我们要做以下两件事:
1.解析配置文件,获取对象信息
2.创建它们是合理的
所以,现在试着按照这个想法
三、模拟Spring IoC的实现
第一步,解析配置文件,获取对象信息;因为Spring配置文件为*.xml档案,就是,XML文件的分辨率。
对XML该解析使用JDOM,jdom下载地址: http://www.jdom.org/downloads/index.html
在第二步中,它们将根据解析的关系被实例化。这里使用的技术是:反射机制
public class ClassPathXmlApplicationContext implements BeanFactory
{
private Map beans = new HashMap(); //IoC容器
public ClassPathXmlApplicationContext() throws Exception
{
SAXBuilder builder = new SAXBuilder();
Document document = builder.build( this.getClass().getClassLoader().getResource( "resource/beans.xml" ) );
Element root = document.getRootElement();
List list = root.getChildren( "bean" ); // 包揽所有bean的Element
for( int i = 0; i < list.size(); i++ )
{
Element element = (Element)list.get( i );
String id = element.getAttributeValue( "id" );
String clazz = element.getAttributeValue( "class" );
System.out.println( id + " : " + clazz );
Object obj = Class.forName( clazz ).newInstance(); // 1th.实例化Bean对象
beans.put( id, obj );
/**
*
*/
// 2th.注入依赖
// 获得所有property属性
for( Element propertyElement : (List)element.getChildren( "property" ) )
{
String name = propertyElement.getAttributeValue( "name" ); // userDAO
String injectBean = propertyElement.getAttributeValue( "bean" ); // u;
Object propertyObj = beans.get( injectBean );
// 3th.拼接userService中 userDAO属性 的 setter方法
// name.substring( 0, 1 ).toUpperCase() 将 u 变成大写
String methodName = "set" + name.substring( 0, 1).toUpperCase() + name.substring( 1 );
System.out.println( "method name = " + methodName );
/**
* getMethod 返回对象的方法。..此方法来自对象的公共方法或接口。 反射机制
* Returns a Method object that reflects the specified
* public member method of the class or interface represented by this Class object.
*/
Method m = obj.getClass().getMethod( methodName, propertyObj.getClass().getInterfaces() );
// 4th.注入
m.invoke( obj, propertyObj );
}
}
}
@Override
public Object getBean( String name )
{
return beans.get( name );
}
}
完整项目的样例代码位于: Spring Ioc模拟源码 ,运行com.hzy.test中的UserServiceTest.java即可。
四、Spring中IoC实现(源代码)
首先,如上图所示,Spring的核心组件Core、Context、Bean这三个;这三个创造了Spring基础,它决定了上面的水平,IoC、AOP、Transaction....这些功能功能。
4.1 这三个核心组件协同工作。
所以看看这三个组件负责什么,把Spring想象一部大型舞台剧,然后:
Context:这部舞台剧的场景和硬件设施
Core 这部舞台剧的工作人员负责协调和调动资源。
Bean :这个舞台不是戏剧演员。
那么每个组件的实际工作是,Bean包装了Object,Object包含数据;Context为Bean在维护的同时提供生活环境Bean与此之间的关系Context对应的Bean这组关系称为IoC容器;而Core就是发现、建立和维护每个Bean两者之间的关系提供了相应的工具类。
下面就以ClassPathXmlApplicationContext来解释这些概念。
查看Api文档,查找ClassPathXmlApplicationContext继承了BeanFactory,BeanFactory是Bean组件的顶级接口,BeanFactory提供了对Bean定义、创造、解决。Bean组件在org.springframework.beans在包裹下面。在同一时间Bean Factory最直接的实现类是。DefaultListableBeanFactory,则在此类中定义一个集合来保存类对象。
Context组件,为了实现资源的调度,ResourceLoader接口,以及Context的ApplicationContext接口继承BeanFactory,这样Context通过ApplicationContext您可以保证访问任何外部资源。
那么我们就实现了Spring IoC这个想法很简单:
1th.解析XML,获取相应的Bean定义
2th.实例化Bean
3th.按注射方式注射 (例如property)
4th.带反射的注入
五、小结
Spring它是一个优秀的开源框架,很多内容都值得学习。
下一节将讨论AOP的实现,AOP是对传统OOP一份增刊,AOP与OOP令人担忧的是:
OOP:
将需求函数划分为不同的、相对独立的、封装良好的类,并让它们拥有自己的行为,依赖于集成和多态来定义它们的关系。
AOP:
将公共需求功能从不相关的类中分离出来,使许多类能够共享单个行为。
6.参考资料
马士兵 《Spring视频》
徐凌波的深入分析。 Java Web 科技内幕
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123



