01_2_模拟spring装载bean
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的更多相关文章
- 工厂模式模拟Spring的bean加载过程
一.前言 在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...
- 反射结合xml简单的模拟spring创建bean
框架最底层其实就是通过反射实现的,就像spring,当你配置各种各样的bean时都是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,这儿写一个简单的 ...
- 简单模拟Spring管理Bean对象
1: 首先我们要利用dom4j进行xml的解析,将所有的bean的配置读取出来. 2:利用java的反射机制进行对象的实例化. 3: 直接获得对象 package cn.Junit.test; imp ...
- 从基础知识到重写Spring的Bean工厂中学习java的工厂模式
1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式: 单例模式是指控制其他对象获 ...
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- 采用dom4j和反射模拟Spring框架的依赖注入功能
Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...
- 尚学堂Spring视频教程(一):模拟Spring
Spring简单的说就是作为控制反转的容器,看这篇文章前需要先搞懂“控制反转和依赖注入“这个设计模式 我们先来模拟Spring,实现用户添加的功能,新建WEB项目”Spring_0100_Abstra ...
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- 理解Spring的Bean工厂
一提到工厂,我们先来回顾前面学习过的工厂方法和抽象工厂模式: 工厂方法:针对产品维度,能够产生新的产品,也能够产生新的产品工厂,既能够扩展产品维度.可是假设我们想在普通工厂上生产产品系列,就会特别麻烦 ...
随机推荐
- 洛谷P1976 鸡蛋饼(Catalan数)
P1976 鸡蛋饼 题目背景 Czyzoiers 都想知道小 x 为什么对鸡蛋饼情有独钟.经过一番逼问,小 x 道出 了实情:因为他喜欢圆. 题目描述 最近小 x 又发现了一个关于圆的有趣的问题:在圆 ...
- 51nod 1562 玻璃切割
1562 玻璃切割 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1562 题目来源: CodeForces 基准时间 ...
- uoj#349. 【WC2018】即时战略(动态点分治)
传送门 头一次看着题解有一种咱不会\(c++\)的感觉-- 看题解吧-- //minamoto #include<bits/stdc++.h> #include "rts.h&q ...
- IT兄弟连 JavaWeb教程 AJAX以及JSON字符串经典案例
案例需求:客户端发送AJAX请求服务器端获取用户信息的数据. 案例实现: 在服务器端要将Java对象转换成JSON字符串,如果使用拼接JSON字符串的方式非常繁琐,并且非常容易出错,所以一般会借助第三 ...
- 联盟链FISCO BCOS权限控制一览
FISCO BCOS是完全开源的联盟区块链底层技术平台,由金融区块链合作联盟(深圳)(简称金链盟)成立开源工作组通力打造.开源工作组成员包括博彦科技.华为.深证通.神州数码.四方精创.腾讯.微众银行. ...
- django导入导出excel实践
一.xlrd和xlwt模块介绍 xlrd模块提供在任何平台上从excel电子表格(.xls和.xlsx)中提取数据的功能,xlwt模块提供生成与Microsoft Excel 95 到2003版本兼容 ...
- CF1141F Same Sum Blocks(easy/hard)
传送门easy 传送门hard 切水题的感觉真好 看到数据范围这么小,所以暴力枚举所有的可能,然后用map+vector存下每种值的区间,然后贪心去选 代码: #include<cstdio&g ...
- King's Pilots
题目链接 (双层图, 一层维护工作,一层维护政策) #include <bits/stdc++.h> using namespace std; inline int read() { ...
- Codeforces 140B(模拟)
要点 题意读好久.大概这样理解:每个时间点按顺序收到序号1-n的卡片,只有收过的卡片才能发给别人并且主人公会发在他心中优先级最高的.由于主人公可以在任何时间给朋友发卡片,最后输出(说得很绕但等价于)1 ...
- 健康检查NET Core之跨平台的实时性能监控
ASP.NET Core之跨平台的实时性能监控(2.健康检查) 前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内 ...