工厂模式模拟Spring的bean加载过程
一.前言
在日常的开发过程,经常使用或碰到的设计模式有代理、工厂、单例、反射模式等等。下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂模式的概念。在来阅读此篇博文,效果会比较好。
二.知识储备
在介绍本文的之前,不了解或不知道如何解析XML的,请先去学习一下XML的解析。掌握目前主要的几种解析XML中的一种即可,以下博文说明了如何采用Dom4J解析XML文件的,接下去的例子也是常用Dom4J来解析XML。博文地址参考:http://www.cnblogs.com/hongwz/p/5514786.html;
学习应该是学习一种方式,而不是学习某一种知识点,掌握了学习的方式,以后在开发中,遇到问题我们就可以快速的解决,快速的学习某一方面不了解的知识点,下面提供几点建议:
1.多阅读源代码,多看一些别人的代码,开卷是有益的。
2.在学习某一项新技术的时候,首先先去下载其对应API进行学习。
3.遇到问题先思考在去google,总有不一样的体会。
三.例子解析
1、创建对应不同的实例
/**
* 汽车类.
*/
public class Car { public void run() {
System.out.println("这是一辆汽车...");
} }
/**
* 火车类.
*/
public class Train { public void run() {
System.out.println("这是一辆火车....");
} }
2、创建BeanFactory
public interface BeanFactory {
Object getBean(String id) throws ExecutionException;
}
/**
* BeanFactory实现类
*/
public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String, Object> map = new HashMap<String, Object>(); @SuppressWarnings("unchecked")
public ClassPathXmlApplicationContext(String fileName) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException { //加载配置文件
SAXReader reader = new SAXReader();
Document document = reader.read(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(fileName)); //获取根节点
Element root = document.getRootElement();
//获取子节点
List<Element> childElements = root.elements(); for (Element element : childElements) {
map.put(element.attributeValue("id"), Class.forName(element.attributeValue("class")).newInstance());
}
} @Override
public Object getBean(String id) throws ExecutionException {
return map.get(id);
} }
3、applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans> <bean id="car" class="com.shine.spring.domain.Car">
</bean> <bean id="train" class="com.shine.spring.domain.Train">
</bean> </beans>
4、测试类
public class BeanFactoryTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, DocumentException, ExecutionException {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("com/shine/spring/applicationContext.xml");
Object obj = beanFactory.getBean("car");
Car car = (Car)obj;
car.run();
}
}
5、运行结果

四.总结
此例子是一个比较简单的小例子,但是涉及的知识点比较多,需要了解的知识面要比较广泛一些,这边主要的提供了一种学习的方式。
工厂模式模拟Spring的bean加载过程的更多相关文章
- Spring IOC bean加载过程
首先我们不要在学习Spring的开始产生畏难情绪.Spring没有臆想的那么高深,相反,它帮我们再项目开发中制定项目框架,简化项目开发.它的主要功能是将项目开发中繁琐的过程流程化,模式化,使用户仅在固 ...
- SSH 之 Spring的源码(一)——Bean加载过程
看看Spring的源码,看看巨人的底层实现,拓展思路,为了更好的理解原理,看看源码,深入浅出吧.本文基于Spring 4.0.8版本. 首先Web项目使用Spring是通过在web.xml里面配置 o ...
- 看看Spring的源码(一)——Bean加载过程
首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的. <li ...
- 【spring】bean加载顺序
问题来源 有一个bean为A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b; private S ...
- Spring源码加载过程图解(一)
最近看了一下Spring源码加载的简装版本,为了更好的理解,所以在绘图的基础上,进行了一些总结.(图画是为了理解和便于记忆Spring架构) Spring的核心是IOC(控制反转)和AOP(面向切面编 ...
- Spring源码:Spring IoC容器加载过程(1)
Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...
- Spring源码:Spring IoC容器加载过程(2)
Spring源码版本:4.3.23.RELEASE 一.加载XML配置 通过XML配置创建Spring,创建入口是使用org.springframework.context.support.Class ...
- spring bean 加载过程(spring)
以classpathXmlApplication为例 入口方法包含3个部分, public ClassPathXmlApplicationContext(String[] configLocation ...
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...
随机推荐
- 预处理命令[#define]说明
宏定义 宏定义是对一些常见的变量.字符串等进行定义,被定义的数据在编译会进行自动替换.有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只 ...
- VMware ubuntu中执行python文件的操作小结
- HTTP返回码中301与302的区别 (转载)
一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved). 302 ...
- JDBC的批处理操作三种方式 pstmt.addBatch()
package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...
- 2016 Google code jam 答案
二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...
- leetcode一些常用函数
6移位操作 “>> 右移,高位补符号位” 这里右移一位表示除2“>>> 无符号右移,高位补0”: 与>>类似“<< 左移” 左移一位表示乘2,二位 ...
- bootStrap树形目录组件
需求描述 产品添加页面,需要选择车型.在bootStrap的modal上弹出子modal来使用.车型一共有4级目录.要使用目录树.然后分活动和商品两种,需要能够通过不通参数来调用该组件.车型品牌要使用 ...
- webbrower判断页面是否加载完成的好方法
public void WaitPageCompleted(int timeOutSec) { ; ; j < timeOutSec * ; j++) { _wb.Invoke(new Acti ...
- Unity3D 响应摇杆
if (Input.GetKeyUp(KeyCode.Joystick1Button0)) { Debug.Log("Joystick1Button0"); } if (Input ...
- go:多核并行化问题
分别用串行和并行实现了一个NUM次加法的程序,代码如下: package main import ( "fmt" //"runtime" //执行并行段时需要引 ...