前两天看到论坛上有人实现的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”中,我们将探讨如何通过XPath解析XML文件来实现这一功能。 首先,让我们了解什么是依赖注入。在传统的编程中,一个类通常会自行创建它需要的对象,这导致了类与对象的紧密耦合。而在...
当我们自己动手实现IOC容器时,可以更深入地理解其内部的工作机制。 ### 1. IOC基本原理 **控制反转**的核心思想是将对象的创建和管理权交给容器,而不是由对象自身负责。这样,对象不再需要知道依赖的具体实现,...
在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中,这些控制权被反转给了Spring容器,使得对象的生命周期管理和依赖注入变得更为灵活和可扩展。 **一、控制反转(IoC)概念*...
1.IOC概念描述 2.Butterknife源码解析 3.手动实现IOC 框架 内容丰富,视频长度大于5小时,一步步解析源码以及手敲代码实现框架核心代码
同时,理解如何通过反射、注解等机制来动态地创建和配置对象,也是实现IoC的关键。 对于MVC,我们需要实现模型层来处理数据,视图层来展示结果,以及控制器层来协调模型和视图的交互。控制器接收用户的请求,处理...
它的核心特性之一就是依赖注入(Dependency Injection,简称 DI),也常被称为“控制反转”(Inversion of Control,简称 IoC)。IoC 是一种设计模式,它通过反转对象创建、配置和管理的控制权,使得应用程序的组件...
在Spring中,主要通过以下几种注解来实现IOC: 1. `@Component`:这是最基础的注解,用于标记一个类为Spring的Bean。将这个注解添加到类上,Spring就会自动扫描并管理这个类的实例。例如: ```java @Component ...
Spring框架-IoC实现CRUD
**IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...
在这个例子中,我们将通过导入Excel数据来深入理解Spring IOC的工作原理,并探讨如何自定义实现。 1. **控制反转**:在传统的编程模式中,我们经常手动创建和管理对象,但在Spring中,对象的创建、初始化、依赖关系...
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...
我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理...【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)
IOC(Inversion of Control,控制反转)框架是软件设计模式中的一个重要概念,它将对象的创建和管理职责从应用程序代码中分离出来,交由框架来处理。这样做的好处是提高了代码的可重用性,降低了模块间的耦合度,...
反射和动态代理在Spring框架中扮演着重要角色,它们是实现IOC和AOP(Aspect-Oriented Programming,面向切面编程)的关键技术。AOP是Spring的另一核心特性,它允许开发者定义横切关注点(如日志、事务管理),并在...
现在我们来详细探讨一下如何从零开始,用纯Java实现一个简单的IoC容器。 首先,我们要理解IoC的概念。IoC是指将控制权从应用程序的代码中转移出来,交由一个外部容器进行管理。在传统的编程模式中,对象会自行创建...
DI则是一种实现IOC的方式,它允许我们通过容器来注入所需的依赖,而不是在类内部硬编码这些依赖。 Spring实现IOC的过程主要包括以下几个步骤: 1. **配置解析**:Spring配置通常以XML或Java注解的形式存在。在启动...
【标题】:“IOC框架实现”涉及的核心概念是Spring框架中的依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,简称IOC)。在Java应用开发中,Spring框架以其强大的IOC容器著称,...
在本项目中,我们通过“利用反射自实现IOC容器”来探讨如何构建一个简单的DI框架,以理解其核心概念和工作原理。 首先,我们需要了解什么是DOM4J。DOM4J是一个Java库,用于处理XML文档,它提供了丰富的API,可以...
.NET Core内置的ServiceCollection和第三方的Autofac都是实现IOC的重要工具,它们帮助开发者轻松管理和解决应用程序的依赖问题。了解并熟练运用这些组件,可以显著提升代码质量,降低维护成本。至于手动实现IOC,...