首先定义一个接口:
public interface Action {
String excute(String msg);
}
然后定义一个类,来实现这个接口:
public class UppperCaseAction implements Action{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String excute(String msg) {
return (message+" "+msg).toUpperCase();
}
}
然后就是配置文件了:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean name="uppercase" class="com.hcy.Spring.UppperCaseAction">
<property name="message">
<value>hello</value>
</property>
</bean>
</beans>
通过反射获取bean实例的类:
package com.hcy.model;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import com.hcy.opxml.Mapping;
import com.hcy.opxml.ParseXml;
public class ApplicationContext {
private static HashMap<String,Mapping> map=null;
static{
map=ParseXml.ParseApplicationContext();
}
public Object getBean(String id){
Object obj=null;
Method[] methods=null;
try {
System.out.println(map.get(id).getClassName());
Class clz=Class.forName(map.get(id).getClassName());
obj=clz.newInstance();
methods=clz.getMethods();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(Method m:methods){
if(m.getName().equalsIgnoreCase(("set"+map.get(id).getProperty()))){
try {
m.invoke(obj, new Object[]{map.get(id).getValue()});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(obj.toString());
return obj;
}
}
解析xml的类:
package com.hcy.opxml;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParseXml {
private static HashMap<String ,Mapping> map=new HashMap<String ,Mapping>();
public static HashMap<String,Mapping> ParseApplicationContext(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=null;
try {
builder=factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Document doc=null;
try {
doc = builder.parse(new File("src/applicationContext.xml"));
} catch (SAXException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
NodeList nodes=doc.getElementsByTagName("bean");
for(int i=0;i<nodes.getLength();i++){
Element e=(Element)nodes.item(i);
String id=e.getAttribute("name");
String className=e.getAttribute("class");
nodes=e.getElementsByTagName("property");
for(int j=0;j<nodes.getLength();j++){
e=(Element)nodes.item(j);
String property=e.getAttribute("name");
String value=e.getElementsByTagName("value").item(0).getFirstChild().getNodeValue();
Mapping mapping=new Mapping();
mapping.setClassName(className);
mapping.setId(id);
mapping.setProperty(property);
mapping.setValue(value);
System.out.println(id+" "+className+" "+property+" "+value);
map.put(mapping.getId(), mapping);
}
}
return map;
}
public static void main(String[] args){
ParseXml px=new ParseXml();
px.ParseApplicationContext();
}
}
通过xml当中的配置,与对应的类对应起来,准确地得到bean的实例:
package com.hcy.opxml;
public class Mapping {
private String id;
private String className;
private String property;
private String value;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
接下来就是测试类:
public static void main(String[] args) {
ApplicationContext ac=new FileSystemXmlApplicationContext("src/applicationContext.xml");
//通过反射机制得到bean的实例
Action act=(Action)ac.getBean("uppercase");
System.out.println(act.excute("yes"));
}
最后附上整个工程:
分享到:
相关推荐
本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...
标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...
【标题】手动实现的简单Spring框架 在Java Web开发领域,Spring框架是一个极其重要的存在,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)架构等。本项目是基于对Spring框架核心...
总的来说,这个项目为开发者提供了一个实践Spring核心概念的平台,通过实际编码加深对IoC和AOP的理解,对于提升Java开发技能和熟悉Spring框架的内部工作原理大有裨益。在实际使用过程中,可以逐步扩展和完善,例如...
参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的Spring框架,以此帮助我们更好地理解Spring的核心机制。这个过程涉及到依赖注入(Dependency Injection,DI)、组件扫描(Component ...
通过以上步骤,我们可以实现一个简单的Java模拟Spring IOC的系统。这种方式可以帮助开发者更好地理解Spring的工作原理,并在没有Spring框架的环境中实现相同的功能。不过,需要注意的是,Spring框架提供了更高级的...
Spring框架是中国Java开发领域中最广泛使用的轻量级框架之一,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极大地简化了企业级应用的开发。...
现在,我们来详细探讨如何简单模拟Spring框架中的CGLIB代理。要进行模拟,首先需要了解CGLIB代理的核心实现原理,包括代理类的生成、方法拦截和回调机制等。 1. 代理类的生成 CGLIB使用Enhancer类来生成代理对象。...
标题中的“自己动手写的类似spring框架”指的是一个教学示例,它是作者为了讲解Spring框架的基本原理而自制的一个简化版框架。这个框架的核心功能是模拟Spring的IoC(Inversion of Control,控制反转)容器,帮助...
通过以上步骤,我们可以构建一个简单的IOC容器,模拟Spring的核心功能。这不仅有助于理解Spring的工作原理,也为我们自定义轻量级框架提供了可能。在实际开发中,了解并掌握Spring的IOC机制能够帮助我们更好地设计和...
通过模拟Spring的实现,我们可以更深入地了解Spring框架的运作机制,包括IoC容器的初始化、bean的生命周期管理、AOP的实现原理等。同时,动手实践能帮助我们更好地掌握这些概念,并将其应用于实际项目中。 总的来说...
本文将通过模拟Spring的`BeanFactory`来深入理解其工作原理,帮助开发者更好地掌握Spring的核心概念。 `BeanFactory`是Spring框架中最基础的bean管理容器,它是所有更高级别的容器(如`ApplicationContext`)的基类...
让我们通过一个简单的例子来模拟Spring的实现。假设我们有一个`UserService`需要依赖`DatabaseService`,在传统模式下,`UserService`会直接创建`DatabaseService`的实例。但在Spring中,我们可以在配置文件中声明这...
在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...
本教程将带你逐步了解如何手写一个简单的Spring框架,以便深入理解其工作原理。 首先,我们要构建的是一个轻量级的依赖注入容器。依赖注入是Spring的核心,它允许我们解耦组件间的依赖关系,使代码更易于测试和维护...
描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...
"模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...
本资源名为“模拟spring和工具jar包”,其目的是为了帮助我们理解Spring框架的核心概念——依赖注入,并通过一个简化版的实现来学习这一机制。 依赖注入是Spring框架的核心特性之一,它允许我们在不直接创建对象的...
"模拟Spring"可能意味着我们将通过一个简化版或实例化的Spring核心功能来学习其工作原理。这种实践性的方法有助于我们更直观地理解Spring如何管理对象和处理依赖关系。 首先,Spring中的“AbstractOrientedProgram...