01_2_模拟spring装载bean

1. xml配置文件内容

beans.xml

<beans>

<bean id="u" class="com.wysj.dao.impl.UserDAOImpl"></bean>

<bean id="userService" class="com.wysj.service.UserService">

<property name="userDAO" bean="u"></property> 

</bean>

</beans>

2. 实体类

User.java

package com.wysj.model;

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;

}

}

3. dao及其实现

UserDAO.java

package com.wysj.dao;

import com.wysj.model.User;

public interface UserDAO {

public void save(User u);

}

UserDAOImpl.java

package com.wysj.dao.impl;

import com.wysj.dao.UserDAO;

import com.wysj.model.User;

public class UserDAOImpl implements UserDAO{

@Override

public void save(User u) {

System.out.println("user saved!");

}

}

4. 业务逻辑类

UserService.java

package com.wysj.service;

import com.wysj.dao.UserDAO;

import com.wysj.dao.impl.UserDAOImpl;

import com.wysj.model.User;

public class UserService {

private UserDAO userDAO;

public void add(User u) {

this.userDAO.save(u);

}

public UserDAO getUserDAO() {

return userDAO;

}

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

}

5. spring读取bean工厂及其实现类

BeanFactory.java

package com.wysj.spring;

public interface BeanFactory {

public Object getBean(String  name);

}

ClassPathXmlApplicationContext.java

package com.wysj.spring;

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 static final int Element = 0;

private Map<String, Object> beans = new HashMap<String, Object>();

@Override

public Object getBean(String name) {

// TODO Auto-generated method stub

return beans.get(name);

}

public ClassPathXmlApplicationContext() throws Exception {

SAXBuilder sb = new SAXBuilder();

Document doc = sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream("beans.xml"));

Element root = doc.getRootElement();

List list = root.getChildren("bean");

for (int i = 0; i < list.size(); i++) {

Element e = (Element) list.get(i);

String id = e.getAttributeValue("id");

String clazz = e.getAttributeValue("class");

System.out.println(id + ":" + clazz);

Object o = Class.forName(clazz).newInstance();

beans.put(id, o);

for(Element propertyElement : (List<Element>)e.getChildren("property")) {

String name = propertyElement.getAttributeValue("name");//userDAO

String bean = propertyElement.getAttributeValue("bean"); //u

Object beanObject = beans.get(bean);

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]);//setUserDAO

m.invoke(o, beanObject);

}

}

}

}

01_2_模拟spring装载bean的更多相关文章

  1. 工厂模式模拟Spring的bean加载过程

    一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...

  2. 反射结合xml简单的模拟spring创建bean

    框架最底层其实就是通过反射实现的,就像spring,当你配置各种各样的bean时都是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,这儿写一个简单的 ...

  3. 简单模拟Spring管理Bean对象

    1: 首先我们要利用dom4j进行xml的解析,将所有的bean的配置读取出来. 2:利用java的反射机制进行对象的实例化. 3: 直接获得对象 package cn.Junit.test; imp ...

  4. 从基础知识到重写Spring的Bean工厂中学习java的工厂模式

    1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获 ...

  5. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

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

    Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...

  7. 尚学堂Spring视频教程(一):模拟Spring

    Spring简单的说就是作为控制反转的容器,看这篇文章前需要先搞懂“控制反转和依赖注入“这个设计模式 我们先来模拟Spring,实现用户添加的功能,新建WEB项目”Spring_0100_Abstra ...

  8. [原]容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...

  9. 理解Spring的Bean工厂

    一提到工厂,我们先来回顾前面学习过的工厂方法和抽象工厂模式: 工厂方法:针对产品维度,能够产生新的产品,也能够产生新的产品工厂,既能够扩展产品维度.可是假设我们想在普通工厂上生产产品系列,就会特别麻烦 ...

随机推荐

  1. bzoj 2632: [neerc2011]Gcd guessing game【贪心】

    这个告诉gcd的操作实际上就是告诉一个因数是否选,最坏情况是1,判断掉所有因数才能选 然后肯定是用猜不重复质数积比较划算,问题就变成若干个质数,分成数量尽量小每组乘积<=n的若干组 从大质数开始 ...

  2. hdu1520 Anniversary party

    Anniversary party HDU - 1520 题意:你要举行一个晚会,所有人的关系可以构成一棵树,要求上下级关系的人不能同时出现,每一个人都有一个rating值,要求使整个晚会的ratin ...

  3. 洛谷P3757 [CQOI2017]老C的键盘

    传送门 首先可以直接把整个序列建成一个完全二叉树的结构,这个应该都看得出来 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小 ...

  4. 重构之Divergent Change(发散式变化)&Shotgun Surgery (散弹式修改)

    5.Divergent Change发散式变化 描述:一个类被锚定了多个变化,当这些变化中的任意一个发生时,就必须对类进行修改. 解释:一个类最好只因一种变化而被修改 操作:你应该找出某特定原因而造成 ...

  5. 14.插入数据、复制数据--SQL

    一.插入完整的行 要求指定表名和插入到新行中的值 INSERT INTO Customers ', 'Toy Land', '123 Any Street', 'New York', 'NY', ', ...

  6. 054 Spiral Matrix 旋转打印矩阵

    给出一个 m x n 的矩阵(m 行, n 列),请按照顺时针螺旋顺序返回元素.例如,给出以下矩阵:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]应该返回 [1,2, ...

  7. 【转】ibatis 中使用select top #pagesize# * from tablename

    ibatis中使用select top #num# * from tableName出现错误.由于初次用ibatis还不知道在它里边拼写SQL语句的一些规则,导致一些自认为很平常的SQL语句,在它这里 ...

  8. 使用gulp-uncss精简css,去除冗余代码

    写html页面的时候,多修改几次就会出现很多无用的css代码,下面使用gulp-uncss来精简css文件,去掉没用的css代码 1.首先找个目录创建一个gulp项目在命令行输入:npm init   ...

  9. where whereis locate find 的用法

    1.where :where ifconfig.用来搜索命令,显示命令是否存在以及路径在哪 2.whereis:whereis vim .用来搜索程序名,而且只搜索二进制文件(参数-b).man说明文 ...

  10. jsp-简单的猜数小游戏

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...