`
wzarx
  • 浏览: 809 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

我也来实现ioc

 
阅读更多
前两天看到论坛上有人实现的ioc功能,也就自己实现了一个基本一样的.
public class MyCompiler {
	ArrayList<BeanModel> resource=new ArrayList<BeanModel>();
	
	HashMap<String,Object>  oo=new HashMap<String,Object>();
	
	public void parseThis() throws SAXException, DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException{
		
		SAXReader sr=new SAXReader();
		
		Document document=sr.read(new File("path"));
		System.out.println("mycompiler");
		Element root=document.getRootElement();
		List thislist=root.elements("bean");
		Iterator ii=thislist.iterator();
		while(ii.hasNext()){
			
			BeanModel bm=new BeanModel();
			Element idNode=(Element)ii.next();
		String id=idNode.attribute("id").getValue();
		String className=idNode.attribute("class").getValue();
		bm.setClassName(className);
		bm.setId(id);
	 HashMap<String,String> propertyNames=new HashMap<String,String>();
		 List refList=idNode.elements("property");
		 	Iterator iiii= refList.iterator();
		 while(iiii.hasNext()){
			 Element eee=(Element)iiii.next();
			 String name=eee.attributeValue("name");
			 String ref=eee.attributeValue("ref");
			 propertyNames.put(name, ref);
		 }
		 bm.setPropertyNames(propertyNames);
		 resource.add(bm);
		 
		}

		
		
	}
	public void instanceAllRef() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
	for(BeanModel bm:resource){
		String id=bm.getId();
		String className=bm.getClassName();
		
		oo.put(id,Class.forName(className).newInstance());
		
	}
	for(BeanModel bm:resource){
		String id=bm.getId();
		String className=bm.getClassName();
		HashMap<String,String> thisMap=bm.getPropertyNames();
		 Set<Map.Entry<String, String>> set = thisMap.entrySet();
		 Iterator<Map.Entry<String, String>> it=set.iterator();
		 while(it.hasNext()){
			 Map.Entry<String,String> entry=it.next();
			 String name=entry.getKey();
			 String ref=entry.getValue();
			Object obj= oo.get(ref);
String setterName="set"+name.substring(0,1).toUpperCase()+name.substring(1);
Method method=oo.get(bm.getId()).getClass().getMethod(setterName,obj.getClass().getInterfaces());//传入属性的接口和class都行  接口更加广泛
			method.invoke(oo.get(bm.getId()), obj);
		 }
		
		
		
	}}
	
    public MyCompiler() throws SAXException, DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException{
		this.parseThis();
		this.instanceAllRef();
	}
		
		
	
	
	public Object getBean(String id){
		
	return this.oo.get(id);	
	
	}
	
	
}



BeanModel

public class BeanModel {
private String id;
private String className;
private HashMap<String,String> propertyNames;
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;
}
public HashMap<String, String> getPropertyNames() {
	return propertyNames;
}
public void setPropertyNames(HashMap<String, String> propertyNames) {
	this.propertyNames = propertyNames;
}




}


只求实现基本的思路和流程.
然后发现反射的时候,如果method的参数指定某一个类的class比如我这边Method method=oo.get(bm.getId()).getClass().getMethod(setterName,obj.getClass().getInterfaces() 改成Method method=oo.get(bm.getId()).getClass().getMethod(setterName,obj.getClass()那么传入的参数是实现类的时候是不能实现的,如果传入参数改成接口或者superclass(),因为getInterfaces()返回的是一个class数组,也是满足参数的类型.
分享到:
评论

相关推荐

    自己实现ioc实例demo

    在这个“自己实现ioc实例demo”中,我们将探讨如何通过XPath解析XML文件来实现这一功能。 首先,让我们了解什么是依赖注入。在传统的编程中,一个类通常会自行创建它需要的对象,这导致了类与对象的紧密耦合。而在...

    自己实现IOC容器

    当我们自己动手实现IOC容器时,可以更深入地理解其内部的工作机制。 ### 1. IOC基本原理 **控制反转**的核心思想是将对象的创建和管理权交给容器,而不是由对象自身负责。这样,对象不再需要知道依赖的具体实现,...

    springIoc实现原理

    在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中,这些控制权被反转给了Spring容器,使得对象的生命周期管理和依赖注入变得更为灵活和可扩展。 **一、控制反转(IoC)概念*...

    手动实现IOC注解框架视频版

    1.IOC概念描述 2.Butterknife源码解析 3.手动实现IOC 框架 内容丰富,视频长度大于5小时,一步步解析源码以及手敲代码实现框架核心代码

    自己动手实现IOC和MVC源码

    同时,理解如何通过反射、注解等机制来动态地创建和配置对象,也是实现IoC的关键。 对于MVC,我们需要实现模型层来处理数据,视图层来展示结果,以及控制器层来协调模型和视图的交互。控制器接收用户的请求,处理...

    实现ioc功能的spring框架

    它的核心特性之一就是依赖注入(Dependency Injection,简称 DI),也常被称为“控制反转”(Inversion of Control,简称 IoC)。IoC 是一种设计模式,它通过反转对象创建、配置和管理的控制权,使得应用程序的组件...

    Spring通过注解实现IOC

    在Spring中,主要通过以下几种注解来实现IOC: 1. `@Component`:这是最基础的注解,用于标记一个类为Spring的Bean。将这个注解添加到类上,Spring就会自动扫描并管理这个类的实例。例如: ```java @Component ...

    利用Java的反射与代理实现IOC模式

    利用Java的反射与代理实现IOC模式 在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的...

    Spring框架-IoC实现CRUD

    Spring框架-IoC实现CRUD

    IOC容器简单实现

    **IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...

    Spring的IoC实现案例

    在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...

    SpringIOC原理实现

    在这个例子中,我们将通过导入Excel数据来深入理解Spring IOC的工作原理,并探讨如何自定义实现。 1. **控制反转**:在传统的编程模式中,我们经常手动创建和管理对象,但在Spring中,对象的创建、初始化、依赖关系...

    模拟实现Spring的IOC

    模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object&gt; beans = new HashMap, Object&gt;...

    SpringIoC的简单实现

    我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理...【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)

    ioc框架,通过动态代理实现.

    IOC(Inversion of Control,控制反转)框架是软件设计模式中的一个重要概念,它将对象的创建和管理职责从应用程序代码中分离出来,交由框架来处理。这样做的好处是提高了代码的可重用性,降低了模块间的耦合度,...

    自己实现的ioc容器

    现在我们来详细探讨一下如何从零开始,用纯Java实现一个简单的IoC容器。 首先,我们要理解IoC的概念。IoC是指将控制权从应用程序的代码中转移出来,交由一个外部容器进行管理。在传统的编程模式中,对象会自行创建...

    简单记录spring 实现IOC的流程

    DI则是一种实现IOC的方式,它允许我们通过容器来注入所需的依赖,而不是在类内部硬编码这些依赖。 Spring实现IOC的过程主要包括以下几个步骤: 1. **配置解析**:Spring配置通常以XML或Java注解的形式存在。在启动...

    ioc框架实现

    【标题】:“IOC框架实现”涉及的核心概念是Spring框架中的依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,简称IOC)。在Java应用开发中,Spring框架以其强大的IOC容器著称,...

    利用反射自实现IOC容器

    在本项目中,我们通过“利用反射自实现IOC容器”来探讨如何构建一个简单的DI框架,以理解其核心概念和工作原理。 首先,我们需要了解什么是DOM4J。DOM4J是一个Java库,用于处理XML文档,它提供了丰富的API,可以...

    Spring IoC实现

    Spring IoC实现Spring IoC实现Spring IoC实现Spring IoC实现

Global site tag (gtag.js) - Google Analytics