模拟Spring依赖注入
通过读取xml文件,利用反射动态加载类和方法,其实就是spring的注入机制
模拟,可以清晰的看出整个运行流程 1、配置文件 applicationContext.xml
<beans>
<bean id="sd" class="dao.impl.IStudentDaoImpl"/>
<bean id="studentService" class="service.StudentService">
<property name="studentDao" ref="sd"/> </bean>
</beans>
property标签中name 为 StudentService.java的属性 2、dao
package dao;
public interface StudentDao {
public void save();
}
3、daoImpl
1)
package dao.impl;
import dao.StudentDao;public class IStudentDaoImpl implements StudentDao {
public void save() {
System.out.println("IStudentDaoImpl.save()");
}
}
2)
package dao.impl;
import dao.StudentDao;
public class StudentDaoImpl implements StudentDao{
public void save() {
System.out.println("StudentDaoImpl.save()");
}
}
4、service
package service;
import dao.StudentDao;
public class StudentService {
private StudentDao studentDao;
public StudentDao getStudentDao() {
return studentDao;
}
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
public void save(){
this.studentDao.save();
}
}
5、解析xml文件
package util; import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder; public class ClassPathXmlApplicationContext {
static Map<String,Object> map=new HashMap<String,Object>();
public void SaxXml() throws Exception{
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("applicationContext.xml"));
Element root=doc.getRootElement();
List<Element> list=root.getChildren("bean");
for(int i=0;i<list.size();i++){
Element ele=list.get(i);
String id=ele.getAttributeValue("id");
String obj=ele.getAttributeValue("class");
Object o=Class.forName(obj).newInstance();
map.put(id, o); for(Element elePro:(List<Element>)ele.getChildren("property")){
String name=elePro.getAttributeValue("name");
String bean=elePro.getAttributeValue("ref");
String methodName="set"+name.substring(0, 1).toUpperCase()+name.substring(1);
System.out.println("MethodName:"+methodName);
Method m=o.getClass().getMethod(methodName, map.get(bean).getClass().getInterfaces()[0]);
m.invoke(o, map.get(bean));
}
}
}
public static Object get(String id){
return map.get(id);
}
}
6、创建测试类
package service;
import static org.junit.Assert.*;
import org.junit.Test;
import util.ClassPathXmlApplicationContext;
public class StudentServiceTest {
@Test
public void testSave() throws Exception {
ClassPathXmlApplicationContext cpac=new ClassPathXmlApplicationContext();
cpac.SaxXml();
StudentService ss=(StudentService)ClassPathXmlApplicationContext.get("studentService");
ss.save();
}
}
输出结果:IStudentDaoImpl.save() ,因为在xml文件中配置的是IStudentDaoImpl 没有配置StudentDaoImpl,所以反射加载的只是IStudentImpl
模拟Spring依赖注入的更多相关文章
- Spring依赖注入 --- 模拟实现
Spring依赖注入 --- 模拟实现 面向接口编程,又称面向抽象编程, 数据库如果发生更改,对应的数据访问层也应该改变多写几个实现,需要用谁的时候在service里new谁就可以了面向抽象编程的好处 ...
- (转)编码剖析Spring依赖注入的原理
http://blog.csdn.net/yerenyuan_pku/article/details/52834561 Spring的依赖注入 前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容 ...
- Spring依赖注入(IOC)那些事
小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Spring依赖注入:注解注入总结
更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...
- Spring 依赖注入,在Main方法中取得Spring控制的实例
Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...
- Spring依赖注入 --- 简单使用说明
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- Spring依赖注入的三种方式
看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...
随机推荐
- js去除左右空格
replace方法去掉字符串的空格 //去左空格; s=s.replace(/(^\s*)/g, ""); //去右空格; s= s.replace(/(\s*$)/g, &qu ...
- path类和directory类对文件的路径或目录进行操作
Path: 对文件或目录的路径进行操作(很方便)[只是对字符串的操作] 1.目录和文件操作的命名控件System.IO 2.string Path.ChangeExtension(string ...
- 像asp.net Mvc一样开发nodejs+express Mvc站点
像asp.net Mvc一样开发nodejs+express Mvc站点 首先,我是个c#码农.从事Mvc开发已然4个年头了,这两年前端MVC的兴起,我也跟风学了一些,对前端的框架也了解一些,angu ...
- Qt学习(四)—实例涂鸦画板mspaint
一.Qt图形绘制 自己在Qt开源社区在自学yafeilinux前辈的<Qt快速入门系列教程>中的图形篇,结合所学的知识,可以做一个涂鸦板实例 二.实现涂鸦板 1.新建工程mspaint, ...
- samba(转)
配置虚拟机和主机之间的文件共享之所以配置虚拟机和主机之间的文件共享,是因为我们用惯了WINDOWS操作系统下的很多工具,比如编辑工具UltraEdit,souce insight等.我们可以在wind ...
- JAVA的类加载器,详细解释
JVM规范定义了两种类型的类装载器:启动内装载器(bootstrap)和用户自定义装载器(user-defined class loader). 一. ClassLoader基本概念 1.ClassL ...
- Machine Learning - Lecture 16
Reinforcement Learning (R.L.) ① MDPs (Markov Decision Processes) ② Value Functions ③ Value Iteration ...
- PHP MySQL Delete From 之 Delete
删除数据库中的数据 DELETE FROM 语句用于从数据库表中删除记录. 语法 DELETE FROM table_name WHERE column_name = some_value 注释:SQ ...
- Oracle学习笔记(2)——过程和函数
过程和函数统称为PL/SQL子程序,通过输入.输出参数或输入/输出参数与其调用者交换信息.他们是被命名的PL/SQL块,被编译后存储在数据库中,以备执行.因此,可以在数据库中直接按名称使用它们. 1. ...
- 【sql语句】好用的sql语句之项目数据库学习总结
转载请注明出处:http://blog.csdn.net/pearyangyang/article/details/41115491 这几天学习公司系统的数据流向.主要涉及到几个表的数据. 可是表中的 ...