我们知道Spring最主要的就是帮我们管理Service,Dao,还有Action。
今天我们就来模拟一下Spring实现的原理,其实就是解析xml和反射机制。
以用户添加为例,直接上代码:
1.User.java
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2.UserDAO.java
import com.yuwl.model.User; public interface UserDAO { public void save(User user); }
3.UserDAOImpl.java
import com.yuwl.dao.UserDAO; import com.yuwl.model.User; public class UserDAOImpl implements UserDAO { public void save(User user) { //Hibernate or Jdbc add System.out.println("user saved!"); } }
4.
package com.yuwl.service; import com.yuwl.dao.UserDAO; import com.yuwl.model.User; public class UserService { private UserDAO userDAO; public void add(User user) { userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } }
5.仿Spring配置文件beans.xml
<beans> <bean id="u" class="com.yuwl.dao.impl.UserDAOImpl" /> <bean id="userService" class="com.yuwl.service.UserService" > <property name="userDAO" bean="u"/> </bean> </beans>
6.仿Spring的BeanFactory.java
package com.yuwl.spring; public interface BeanFactory { public Object getBean(String id); }
7.仿Spring的ClassPathXmlApplicationContext.java
import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String , Object> beans = new HashMap<String, Object>(); public ClassPathXmlApplicationContext() throws Exception { //jdom解析xml SAXBuilder sb=new SAXBuilder(); Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); Element root=doc.getRootElement(); List list=root.getChildren("bean"); for(int i=0;i<list.size();i++){ Element element=(Element)list.get(i); String id=element.getAttributeValue("id"); String clazz=element.getAttributeValue("class"); Object o = Class.forName(clazz).newInstance(); beans.put(id, o); for(Element propertyElement : (List<Element>)element.getChildren("property")) { String name = propertyElement.getAttributeValue("name"); //userDAO String bean = propertyElement.getAttributeValue("bean"); //u Object beanObject = beans.get(bean);//UserDAOImpl instance String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); System.out.println("method name = " + methodName); //反射 Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); m.invoke(o, beanObject); } } } public Object getBean(String id) { return beans.get(id); } }
8.测试
import org.junit.Test; import com.yuwl.model.User; import com.yuwl.spring.BeanFactory; import com.yuwl.spring.ClassPathXmlApplicationContext; public class UserServiceTest { @Test public void testAdd() throws Exception { BeanFactory applicationContext = new ClassPathXmlApplicationContext(); UserService service = (UserService)applicationContext.getBean("userService"); User u = new User(); u.setUsername("yuwl"); u.setPassword("123456"); service.add(u); } }
执行成功:
user saved!
接下来,将深入Spring的IOC学习。
相关推荐
本文将深入探讨如何模拟Spring实现包扫描器功能,以便在不依赖Spring框架的情况下,扫描指定包下的所有类。 首先,我们需要理解Spring是如何进行包扫描的。在Spring中,这个过程由`org.springframework.context....
在本文中,我们将探讨如何通过Java来模拟Spring框架的基本功能。Spring是一个广泛应用的开源框架,它主要为Java应用程序提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
要模拟Spring的IOC容器,我们需要实现以下几个核心功能: - **Bean定义(Bean Definition)**:存储对象的创建信息,如类名、属性值、依赖关系等。 - **Bean工厂(Bean Factory)**:负责读取Bean定义,并根据定义...
如果能够访问到这个文件,那么我们可以更深入地了解博主如何实现模拟Spring容器的过程。 总之,这个主题涵盖的内容非常广泛,包括了Spring的核心概念、IoC/DI的原理、容器的模拟实现以及可能涉及的开发工具。深入...
本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...
这篇博客“java模拟spring ioc”很可能是探讨如何在没有Spring框架的情况下,使用纯Java代码来实现类似Spring的IOC功能。以下将详细介绍Spring的IOC和DI概念以及如何模拟这些概念。 **依赖注入(Dependency ...
在模拟Spring的过程中,我们需要理解如何设计接口和实现类,以及如何通过容器来管理这些对象并负责它们之间的依赖关系。DI通常通过构造器注入、设值注入和接口注入等方式实现。 2. **组件扫描(Component Scanning...
模拟Spring并不是重新创建一个完整的Spring框架,而是为了学习和理解Spring的工作原理,通过编写简单的代码来实现IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的核心...
当我们谈论"Java模拟的spring实现"时,这意味着我们要通过纯Java代码来模拟Spring框架的一些关键特性。这有助于我们深入理解Spring的工作原理,并能在没有Spring环境的情况下进行教学、学习或测试。 首先,让我们来...
通过模拟Spring的实现,我们可以更深入地了解Spring框架的运作机制,包括IoC容器的初始化、bean的生命周期管理、AOP的实现原理等。同时,动手实践能帮助我们更好地掌握这些概念,并将其应用于实际项目中。 总的来说...
"模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...
在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...
在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是如何工作的,以及如何通过Java代码来模拟这个过程。 首先,让我们了解什么是Spring的IoC。IoC是一种设计模式,它将...
这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...
本资源名为“模拟spring和工具jar包”,其目的是为了帮助我们理解Spring框架的核心概念——依赖注入,并通过一个简化版的实现来学习这一机制。 依赖注入是Spring框架的核心特性之一,它允许我们在不直接创建对象的...
本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...
`ClassPathXmlApplicationContext`的实现涉及到了许多Spring的核心概念,如bean的生命周期管理、依赖注入、资源定位和XML解析。理解这个类的工作原理对于深入学习Spring框架是非常有帮助的。通过阅读和分析Spring的...
这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...
Spring框架是目前Java企业开发中最为流行...总结来说,通过模拟Spring的CGLIB代理,我们可以更深入地理解AOP的实现机制和代理模式的工作原理。这对于加深对Spring框架的理解以及开发高质量的Java应用都是非常有帮助的。