简单模拟 Spring
项目结构
主要代码如下
| 1 2 3 4 5 6 | publicclassUser {    privateString username;    privateString password;    // getter and setter ..} | 
| 1 2 3 4 5 6 | <beans>    <bean id="u"class="com.demo.dao.impl.UserDAOImpl"/>    <bean id="userService"class="com.demo.service.UserService">        <property name="userDAO"bean="u"/>    </bean></beans> | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | /** * 管理器 *  * @author jerome_s@qq.com */publicclassClassPathXmlApplicationContext implementsBeanFactory {    privateMap<String, Object> beans = newHashMap<String, Object>();    /**     * 初始化配置文件     * 模拟spring配置文件。模拟大的工厂,把东西都写到大的配置文件,通过代码读取xml文件模拟spring。     *      * @throws Exception     */    @SuppressWarnings("unchecked")    publicClassPathXmlApplicationContext() throwsException {        System.out.println("ClassPathXmlApplicationContext init.");        SAXBuilder sb = newSAXBuilder();        Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象        Element root = doc.getRootElement(); // 获取根元素HD        List<Element> list = root.getChildren("bean");// 取名字为bean的所有元素        // 循环每个bean        for(inti = 0; i < list.size(); i++) {            Element element = list.get(i);            String id = element.getAttributeValue("id");            String clazz = element.getAttributeValue("class");            Object o = Class.forName(clazz).newInstance();            System.out.println("ClassPathXmlApplicationContext bean's id = "+ id);            System.out.println("ClassPathXmlApplicationContext bean's class = "+ clazz);            beans.put(id, o);            // 循环bean下的property            for(Element propertyElement : (List<Element>) element.getChildren("property")) {                // 调用 setUserDAO 设置 userDao的值                String name = propertyElement.getAttributeValue("name"); // userDAO                String bean = propertyElement.getAttributeValue("bean"); // u                System.out.println("ClassPathXmlApplicationContext bean's property name = "+ name);                System.out.println("ClassPathXmlApplicationContext bean's property bean = "+ bean);                Object beanObject = beans.get(bean);// UserDAOImpl instance                // userDAO -> setUserDao                String methodName = "set"+ name.substring(0, 1).toUpperCase() + name.substring(1);                Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);                m.invoke(o, beanObject);                System.out.println("ClassPathXmlApplicationContext bean's property invoke method "+ methodName);            }            System.out.println("-------------------------");        }    }    publicObject getBean(String id) {        returnbeans.get(id);    }} | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | publicclassUserService {    privateUserDAO userDAO;    publicvoidadd(User user) {        userDAO.save(user);    }    publicUserDAO getUserDAO() {        returnuserDAO;    }    publicvoidsetUserDAO(UserDAO userDAO) {        this.userDAO = userDAO;    }} | 
| 1 2 3 4 5 6 7 8 | publicclassUserDAOImpl implementsUserDAO {    publicvoidsave(User user) {        System.out.println("UserDAOImpl saved()");        System.out.println("user.toString() = "+ user.toString());    }} | 
源码
简单模拟 Spring的更多相关文章
- (反射+内省机制的运用)简单模拟spring IoC容器的操作
		简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ... 
- 一道面试题,简单模拟spring ioc
		自己实现的,程序写的土了点,很多情况没去考虑,主要是复习理解怎么使用反射来实现spring 的依赖注入. package dom4jtest; import java.lang.reflect.Inv ... 
- 简单模拟Spring的注入
		主要就是读XML技术和反射技术. 在xml中读出相关配置信息,然后利用反射将其实例化为对象,并调用其构造方法,在实例化的过程中将属性注入实例. 实例化和属性注入这些操作都交给了框架,不再需要自己的去n ... 
- 简单模拟Spring管理Bean对象
		1: 首先我们要利用dom4j进行xml的解析,将所有的bean的配置读取出来. 2:利用java的反射机制进行对象的实例化. 3: 直接获得对象 package cn.Junit.test; imp ... 
- 【Spring系列】- 手写模拟Spring框架
		简单模拟Spring 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 前言 上次已经学习了 ... 
- spring之mvc原理分析及简单模拟实现
		在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model ... 
- java web学习总结(二十二) -------------------简单模拟SpringMVC
		在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ... 
- 工厂模式模拟Spring的bean加载过程
		一.前言 在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ... 
- 尚学堂Spring视频教程(一):模拟Spring
		Spring简单的说就是作为控制反转的容器,看这篇文章前需要先搞懂“控制反转和依赖注入“这个设计模式 我们先来模拟Spring,实现用户添加的功能,新建WEB项目”Spring_0100_Abstra ... 
随机推荐
- Kafka(转载)
			Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ... 
- Tomcat常用参数的配置
			1.修改端口号 Tomcat端口配置在server.xml文件的Connector标签中,默认为8080,可根据实际情况修改. 修改端口号 2.解决URL中文参数乱码 在server.xml文件的Co ... 
- 修改apache默认主页,重定向404页面
			yum 下载apache后默认主页 默认配置文件: vim /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/welcome.conf 跳转页面到 /var/w ... 
- RHEL Linux常用指令
			查询已安装软件包 rpm -qa|grep * 安装软件 rpm -ivh * 查询Linux版本 uname -a lsb_release -a cat /etc/redhat-release ca ... 
- 谈谈Circuit Breaker在.NET Core中的简单应用
			前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不了服务之间的相互调用问题!如果调用没有处理好,就有可能造成整个系统的 ... 
- linux:关于Linux系统中 CPU Memory IO Network的性能监测
			我们知道:系统优化是一项复杂.繁琐.长期的工作.通常监测的子系统有以下这些:CPUMemoryIO Network 下面是常用的监测工具 Linux 系统包括很多子系统(包括刚刚介绍的CPU,Memo ... 
- Android ocr识别文字介绍(文字识别)
			最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ... 
- win10+ubuntu双系统安装方案
			网上有很多教程,大多是win7,win8的,我折腾了一天,今天终于都安装好了,折腾的够呛,很多人都说挺简单的,嗯其实的确很简单,很多人回复说安装不成功,很有可能就是电脑安全权限的问题,我用的是华硕的电 ... 
- 在自己笔记本电脑上如何访问虚拟机的内容、包括可以使用ssh、访问tomcat、访问nginx
			1.给自己的电脑设置一个回环网卡,关于如何配置回环网卡,可以百度搜索一下 设置好后的状态如下: 并把回环网卡的ipv4的值设置成192.168.1.1 配置如下: 2.将vmware中的"虚 ... 
- ORA-28001: the password has expired 详解 不用重启项目
			大早上正式库提示: Oracle提示错误消息ORA-28001: the password has expired 解决办法: 1.利用SYSDBA权限登陆: 2.查看账户信息:select user ... 
