Spring IOC之 原理模拟
2014-06-15 11:42
218 查看
注:转载请标明出处,请尊重他人劳动成果。 http://greenyouyou.blog.163.com/blog/static/1383881472011820103155286/
IOC(Inversion Of Control)即控制反转,他是spring的核心机制,为什么叫控制反转了?因为在没有spring之前,对象的控制权可以说是由我们控制的,而使用spring之后,将对象的控制权交给了spring,交给了框架,所以就叫个控制反转(IOC)。
下面是我模拟Spring的控制反转机制的代码部分,其实不难,spring他要实现控制反转应该怎么做了?首先他应该读取配置文件中的配置,然后根据从配置文件中读到的类信息,利用反射技术去生成对象实例。我们读取配置文件使用的是dom4J技术。
public
class ClassPathXMLApplicationContext {
private List<BeanDefinition>
beanDefines =
new ArrayList<BeanDefinition>();
private Map<String, Object>
sigletons =
new HashMap<String, Object>();
public ClassPathXMLApplicationContext(String filename){
this.readXML(filename);
this.instanceBeans();
}
/**
*
完成bean的实例化
*/
private
void instanceBeans() {
for(BeanDefinition beanDefinition :
beanDefines){
try {
if(beanDefinition.getClassName()!=null
&& !"".equals(beanDefinition.getClassName().trim()))
sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
读取xml配置文件
* @param
filename
*/
private
void readXML(String filename) {
SAXReader saxReader =
new SAXReader();
Document document=null;
try{
URL xmlpath =
this.getClass().getClassLoader().getResource(filename);
document = saxReader.read(xmlpath);
Map<String,String> nsMap =
new HashMap<String,String>();
nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间
XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径
xsub.setNamespaceURIs(nsMap);//设置命名空间
List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点
for(Element element: beans){
String id = element.attributeValue("id");//获取id属性值
String clazz = element.attributeValue("class");
//获取class属性值
BeanDefinition beanDefine =
new BeanDefinition(id, clazz);
beanDefines.add(beanDefine);
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
*
获取bean实例
* @param
beanName
* @return
*/
public Object getBean(String beanName){
return
this.sigletons.get(beanName);
}
}
这是的BeanDefinition的定义:
public
class BeanDefinition {
private String
id;
private String
className;
public BeanDefinition(String id, String className) {
this.id
= id;
this.className
= className;
}
public String getId() {
return
id;
}
public
void setId(String id) {
this.id
= id;
}
public String getClassName() {
return
className;
}
public
void setClassName(String className) {
this.className
= className;
}
}
IOC(Inversion Of Control)即控制反转,他是spring的核心机制,为什么叫控制反转了?因为在没有spring之前,对象的控制权可以说是由我们控制的,而使用spring之后,将对象的控制权交给了spring,交给了框架,所以就叫个控制反转(IOC)。
下面是我模拟Spring的控制反转机制的代码部分,其实不难,spring他要实现控制反转应该怎么做了?首先他应该读取配置文件中的配置,然后根据从配置文件中读到的类信息,利用反射技术去生成对象实例。我们读取配置文件使用的是dom4J技术。
public
class ClassPathXMLApplicationContext {
private List<BeanDefinition>
beanDefines =
new ArrayList<BeanDefinition>();
private Map<String, Object>
sigletons =
new HashMap<String, Object>();
public ClassPathXMLApplicationContext(String filename){
this.readXML(filename);
this.instanceBeans();
}
/**
*
完成bean的实例化
*/
private
void instanceBeans() {
for(BeanDefinition beanDefinition :
beanDefines){
try {
if(beanDefinition.getClassName()!=null
&& !"".equals(beanDefinition.getClassName().trim()))
sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
读取xml配置文件
* @param
filename
*/
private
void readXML(String filename) {
SAXReader saxReader =
new SAXReader();
Document document=null;
try{
URL xmlpath =
this.getClass().getClassLoader().getResource(filename);
document = saxReader.read(xmlpath);
Map<String,String> nsMap =
new HashMap<String,String>();
nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间
XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径
xsub.setNamespaceURIs(nsMap);//设置命名空间
List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点
for(Element element: beans){
String id = element.attributeValue("id");//获取id属性值
String clazz = element.attributeValue("class");
//获取class属性值
BeanDefinition beanDefine =
new BeanDefinition(id, clazz);
beanDefines.add(beanDefine);
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
*
获取bean实例
* @param
beanName
* @return
*/
public Object getBean(String beanName){
return
this.sigletons.get(beanName);
}
}
这是的BeanDefinition的定义:
public
class BeanDefinition {
private String
id;
private String
className;
public BeanDefinition(String id, String className) {
this.id
= id;
this.className
= className;
}
public String getId() {
return
id;
}
public
void setId(String id) {
this.id
= id;
}
public String getClassName() {
return
className;
}
public
void setClassName(String className) {
this.className
= className;
}
}
相关文章推荐
- spring IOC 实现原理模拟实现
- spring ioc原理(模拟ioc原理代码)
- 【Spring】Spring的IOC(控制反转)/DI(依赖注入)原理(二):模拟Spring加载配置文件
- spring IOC 实现原理模拟实现
- 利用java反射机制模拟spring IOC原理的实现
- spring IOC 实现原理模拟实现
- 自己模拟实现spring IOC原理
- Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- 转:Spring技术内幕——深入解析Spring架构与设计原理(三)IOC实现原理
- 转:Spring技术内幕——深入解析Spring架构与设计原理(二)IOC实现原理
- Spring模拟(DI,IOC)
- Spring的IOC原理
- spring之ioc原理
- spring ioc 、 aop原理
- spring ioc原理,IoC与DI-网摘
- 模拟Spring的内部原理读取配置文件,实例化
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- 什么是IOC(DI),有什么好处(java project 的spring IOC模拟)