模拟Spring框架

BeanFactory

1 package com.bjsxt.spring;
2
3 public interface BeanFactory {
4     public Object getBean(String name);
5 }

ClassPathXmlApplicationContext

 1 package com.bjsxt.spring;
 2
 3 import java.lang.reflect.Method;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7
 8 import org.jdom.Document;
 9 import org.jdom.Element;
10 import org.jdom.input.SAXBuilder;
11
12 public class ClassPathXmlApplicationContext implements BeanFactory{
13     private Map<String, Object> beans = new HashMap<String, Object>();
14
15     public ClassPathXmlApplicationContext() throws Exception{
16         SAXBuilder sb = new SAXBuilder();
17         Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
18         Element root = doc.getRootElement();//获取根元素
19         List list = root.getChildren("bean");//取名字为bean的所有元素
20         for(int i=0; i<list.size(); i++){
21             Element element = (Element) list.get(i);
22             String id = element.getAttributeValue("id");
23             String clazz = element.getAttributeValue("class");
24             System.out.println(id + ":" + clazz);
25             Object o = Class.forName(clazz).newInstance();
26             beans.put(id, o);
27
28             for(Element propertyElement : (List<Element>)element.getChildren("property")){
29                 String name = propertyElement.getAttributeValue("name");//userDAO
30                 String bean = propertyElement.getAttributeValue("bean");//u
31                 Object beanObject = beans.get(bean);//UserDAOImpl instance
32
33                 String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
34                 System.out.println("method name = " + methodName);
35
36                 Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
37                 m.invoke(o, beanObject);
38             }
39         }
40     }
41
42     public Object getBean(String name) {
43         return beans.get(name);
44     }
45
46 }

beans.xml

1 <beans>
2     <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"></bean>
3     <bean id="userService" class="com.bjsxt.service.UserService">
4         <property name="userDAO" bean="u"></property>
5     </bean>
6 </beans>

UserDAO

1 package com.bjsxt.dao;
2
3 import com.bjsxt.model.User;
4
5 public interface UserDAO {
6     public void save(User u);
7 }

UserDAOImpl

 1 package com.bjsxt.dao.impl;
 2
 3 import com.bjsxt.dao.UserDAO;
 4 import com.bjsxt.model.User;
 5
 6 public class UserDAOImpl implements UserDAO{
 7
 8     public void save(User u) {
 9         System.out.println("a user saved!");
10     }
11
12 }

测试类:

 1 package com.bjsxt.service;
 2
 3 import org.junit.Test;
 4
 5 import com.bjsxt.model.User;
 6 import com.bjsxt.spring.BeanFactory;
 7 import com.bjsxt.spring.ClassPathXmlApplicationContext;
 8
 9 public class UserServiceTest {
10
11     @Test
12     public void testAddUser() throws Exception {
13         BeanFactory factory = new ClassPathXmlApplicationContext();
14
15         UserService service = (UserService)factory.getBean("userService");
16         User u = new User();
17         service.addUser(u);
18     }
19
20 }

代码链接: http://pan.baidu.com/s/1eSoYu8i 密码: gtj2

所需jar包:

  junit链接: http://pan.baidu.com/s/1kVFS8lx 密码: mkh3

  jdom链接: http://pan.baidu.com/s/1c1X15Xu 密码: 9vpi

时间: 2024-10-31 04:12:23

模拟Spring框架的相关文章

采用dom4j和反射模拟Spring框架的依赖注入功能

Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面是具体的步骤: 第一步,编写配置文件.配置文件的书写,采用了和Spring的配置文件applicationContext.xml一样的书写规则: <?xml version="1.0" encoding="UTF-8"?> <!-- applicati

Java开发工程师(Web方向) - 04.Spring框架 - 第3章.AOP技术

Spring框架 - AOP概述 笔记https://my.oschina.net/hava/blog/758873Spring框架 - AOP使用 笔记https://my.oschina.net/hava/blog/758881 AOP技术单元测试 返回 本次得分为:7.00/7.00, 本次测试的提交时间为:2017-09-11, 如果你认为本次测试成绩不理想,你可以选择再做一次. 1 单选(2分) 如下关于AOP的描述中错误的是: 得分/总分 A. AOP可以对代码进行解耦: B. A

Spring 框架的架包分析、功能作用、优点,及jar架包简介

Spring 框架的架包详解    Spring的作用     Spring的优势 由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关jar的作用.关系.这篇文章总结一下spring框架的相关知识. 一.spirng的简介(高手可以跳过) Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Sprin

Spring框架事务支持模型的优势

全局事务 全局事务支持对多个事务性资源的操作,通常是关系型数据库和消息队列.应用服务器通过JTA管理全局性事务,API非常烦琐.UserTransaction通常需要从JNDI获取,意味着需要与JNDI绑定在一起,且JTA一般只在应用服务器可用,降低了应用代码的可重用性. 本地事务 本地事务面向具体的资源,例如与JDBC连接关联的事务.本地事务易于使用,但不能跨多个事务性资源.使用JDBC管理事务的代码不能在全局JTA事务中运行,因此不能确保跨多个资源的正确性.且本地事务侵入了编程模型. Spr

跟着刚哥学习Spring框架--AOP(五)

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这种散布在各

Spring框架学习(二)IOC注入之set/get方法

action层需要调用service层对象,service层又需要调用dao层的对象.一般情况而言就直接newXXX()使用就可以了,但 是这种方法会使程序的耦合性太强.当Action类中需要更换service方法时,就需要改动源代码.Spring框架就用IOC注入的方法帮我们解决 了这个问题. 示例代码(模拟WEB环境下): applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> &

Spring框架初识(一)

1. Spring框架概述 1.1 简介 Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架.   1.2 优点 方便解耦,简

模拟spring注入

尊重原创:原创和源代码地址 项目中的的spring出现问题,不想使用spring框架进行注入,编写一个简单的spring,实现xml解析和类的注入.所有的框架都可以用java项目,用到了java提供的基础类,所以用到的原理也就呢么多(我刚开始工作2个月,说的不对请谅解).因此spring用到了注入用到java中的反射机制,aop用到了java的代理机制proxy对象.总结一下自己的设计: 设计范围三层: 第一层是实体层,根据自己定义的xml规则抽象除了两个对象实体,一个是实体对象bean(程序中

模拟spring - 动手写一个spring AOP

一.前言 AOP (Aspect Oriented Programing) - 面向切面编程,它主要用于日志记录.性能分析.安全控制.事务处理.异常处理等方面. AOP主要使用JDK的反射和动态代理,AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用,AOP代理包含了目标对象的全部方法,但AOP代理的方法与目标对象的方法存在差异:AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法. 动态代理的文章请参考:http://blog.csdn.net/zdp072/ar