利用dom4j简单模拟了一下spring是如何注入的,并用junit简单进行了一下测试。
定义一个BeanFactory接口,包含一个得到bean的方法
public interface BeanFactory {
Object getBean(String name);
}
定义一个ClassPathXmlApplicationContext类,利用dom4j解析bean.xml文件,用反射生成所需要的实例对象放入到beans容器中
package com.test.myspring;
import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ClassPathXmlApplicationContext implements BeanFactory{
private Map<String,Object> beans = new HashMap<String,Object>();
@SuppressWarnings("rawtypes")
public ClassPathXmlApplicationContext(){
SAXReader reader = new SAXReader();
Document document;
try {
document = reader.read(new FileInputStream("bean.xml")); //得到xml文档,xml文件置于工程根目录下
Element root = document.getRootElement(); //得到根元素
for(Iterator i = root.elementIterator();i.hasNext();){
Element element = (Element)i.next();
String id = element.attributeValue("id"); //userDao
String clazz = element.attributeValue("class"); //com.test.myspring.UserDAOImpl
Object o = Class.forName(clazz).newInstance(); //生成UserDAOImpl的一个实例
beans.put(id, o);
for(Iterator ei = element.elementIterator();ei.hasNext();){ //遍历子元素
Element childe = (Element)ei.next();
String name = childe.attributeValue("name"); //本例中是得到userDao
String bean = childe.attributeValue("bean");
Object objectBean = beans.get(bean); //从beans容器中得到UserDAOImpl的实例
String methodName = "set"+name.substring(0, 1).toUpperCase()
+name.substring(1); //得到setUserDao方法名
Method method = o.getClass().getMethod(methodName,
objectBean.getClass().getInterfaces()[0]); //通过反射得到该方法
method.invoke(o, objectBean);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String name) {
return beans.get(name);
}
}
bean.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="com.test.myspring.UserDAOImpl"/>
<bean id="userService" class="com.test.myspring.UserService">
<property name="userDao" bean="userDao"/>
</bean>
</beans>
另外有User、UserDAO、UserDAOImpl、UserService
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface UserDAO {
void add(User u);
}
public class UserDAOImpl implements UserDAO {
@Override
public void add(User u) {
System.out.println("A user has saved!");
}
}
public class UserService {
private UserDAO userDao;
public UserDAO getUserDao() {
return userDao;
}
public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}
public void add(User u){
this.userDao.add(u);
}
}
写一个简单的类UserServiceTest测试下
import org.junit.Test;
public class UserServiceTest {
@Test
public void testAdd(){
BeanFactory factory = new ClassPathXmlApplicationContext();
//首先直接得到了UserService的一个实例us
//然后通过ClassPathXmlApplicationContext中的第二个for循环自动装配了userDao
UserService us = (UserService)factory.getBean("userService");
User u = new User();
us.add(u);
}
}
运行输出A user has saved! 这里并没有真正去连接数据库。
分享到:
相关推荐
本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...
在本文中,我们将探讨如何通过Java来模拟Spring框架的基本功能。Spring是一个广泛应用的开源框架,它主要为Java应用程序提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...
标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...
**模拟Spring的IOC** 在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC...
这篇博客“java模拟spring ioc”很可能是探讨如何在没有Spring框架的情况下,使用纯Java代码来实现类似Spring的IOC功能。以下将详细介绍Spring的IOC和DI概念以及如何模拟这些概念。 **依赖注入(Dependency ...
在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...
这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...
本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...
这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...
【标题】:“自己动手模拟spring” 【描述】:在该主题中,我们将深入理解Spring框架的核心概念,并通过编码实践来模拟其工作原理。参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的...
本资源名为“模拟spring和工具jar包”,其目的是为了帮助我们理解Spring框架的核心概念——依赖注入,并通过一个简化版的实现来学习这一机制。 依赖注入是Spring框架的核心特性之一,它允许我们在不直接创建对象的...
现在,我们来详细探讨如何简单模拟Spring框架中的CGLIB代理。要进行模拟,首先需要了解CGLIB代理的核心实现原理,包括代理类的生成、方法拦截和回调机制等。 1. 代理类的生成 CGLIB使用Enhancer类来生成代理对象。...
《尚学堂_Spring_0100_模拟Spring》 在深入探讨Spring框架之前,我们需要先理解Spring的核心理念。Spring是一个开源的Java平台,它主要为构建企业级应用提供了全面的编程和配置模型。它的核心特性是依赖注入...
本文将通过模拟Spring的`BeanFactory`来深入理解其工作原理,帮助开发者更好地掌握Spring的核心概念。 `BeanFactory`是Spring框架中最基础的bean管理容器,它是所有更高级别的容器(如`ApplicationContext`)的基类...
**模拟Spring AOP技术** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的...
本篇文章将深入探讨如何通过Java代码来模拟Spring的依赖注入机制。 **依赖注入的概念** 依赖注入是一种设计模式,它允许对象在运行时获取其依赖项,而不是在构造函数或初始化方法中硬编码这些依赖项。这样做的好处...
现在,我们将深入探讨如何通过自己的代码来模拟Spring的依赖注入。 首先,理解依赖注入的概念至关重要。依赖注入意味着组件不直接创建其依赖的对象,而是由外部实体(如Spring IoC容器)提供。这样做的好处是,我们...
"模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...
本篇文章将详细解析“模拟Spring IOC技术”的核心概念,并通过一个小Demo帮助你深入理解IOC的工作原理。 首先,我们来解释一下什么是IOC和DI。控制反转(IOC)是编程中的一个设计原则,它改变了对象获取依赖的方式...