模拟Spring中applicationContext.xml配置文件初始化bean的过程
package com.xiaohao.action; import java.io.File;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; /**
* 需要导入dom4j的jar包
* @author 小浩
* @创建日期 2015-4-4
*/
public class BeanFactory { /**
* 保存容器中所有单例模式的bean实例,这里的hashMap是线程安全的
*
*/ private static Map<String,Object> beanPool=Collections.synchronizedMap(new HashMap<String,Object>());
//保存文件对应的Document对象
private Document document;
//保存配置文件里的根元素
private Element root; /**
* 构造方法,指定需要读取的文件的路径
* @param filePath
* @throws Exception
*/
public BeanFactory(String filePath) throws Exception{ //使用dom4j读取xml配置文件
SAXReader reader=new SAXReader();
document=reader.read(new File(filePath));
root=document.getRootElement();
//进行容器的初始化
initPool();
//初始化单例bean的属性
initProp(); } /**
* 获取指定的bean
* @param name
* @return
* @throws Exception
*/
public static Object getBean(String name) throws Exception {
Object target = beanPool.get(name);
//对于单例bean,容器已经初始化了所有的Bean实例
if(target.getClass() != String.class){
return target;
}else{
String clazz = (String)target;
//对于非单例的并未注入属性值
return Class.forName(clazz).newInstance();
} } /**
* 初始化容器中的所有单例bean
* */
private void initPool() throws Exception{
//遍历配置文件中的每个<bean ../>元素
for(Object obj:root.elements()){
Element beanElement = (Element)obj;
//获取Bean元素中的id属性
String beanId = beanElement.attributeValue("id");
//获取bean元素中的class属性
String beanClazz = beanElement.attributeValue("class");
//获取bean元素中的scope属性
String beanScope = beanElement.attributeValue("scope");
//如果scope属性不存在或为singleton
if(beanScope == null|| beanScope.equals("singleton")){
//以默认构造方法创建bean实例,并将其放入beanPool中
beanPool.put(beanId, Class.forName(beanClazz).newInstance()); //利用反射的技术
}else{
//对于非单例的,存放Bean实现类的类名
beanPool.put(beanId, beanClazz);
}
} } /**
* 初始化容器中的单例bean
* */
private void initProp() throws Exception{
//遍历配置文件中的所有bean元素,即根节点的子节点
for(Object object:root.elements()){
Element beanElement = (Element)object;
//获取Bean元素中的id属性
String beanId = beanElement.attributeValue("id");
//获取bean元素中的scope属性
String beanScope = beanElement.attributeValue("scope");
//如果scope属性不存在或为singleton
if(beanScope == null|| beanScope.equals("singleton")){
//取出beanPool的指定bean实例
Object bean = beanPool.get(beanId);
//遍历bean属性下的所有property属性
for(Object prop: beanElement.elements()){
Element probElement = (Element)prop;
//获取property的name属性
String propName = probElement.attributeValue("name");
//获取property的value属性
String propValue = probElement.attributeValue("value");
//获取property的ref属性
String propRef = probElement.attributeValue("ref");
//将属性名的首字母大写
String propNameCamelize = propName.substring(0,1).toUpperCase()
+propName.substring(1, propName.length());
//如果value值存在
if(propValue != null&&propValue.length()> 0){
//获取设置注入所需要的setter方法
java.lang.reflect.Method setter = bean.getClass().getMethod("set"+propNameCamelize, String.class);
//执行setter注入
setter.invoke(bean, propValue);
}
if(propRef != null&&propRef.length()> 0){
//取得需要被注入的bean实例
Object target = beanPool.get(propRef);
//如果不存在
if(target == null){
//此处处理单例bean依赖于非单例bean的情形
}
//定义设值注入需要的setter方法
Method setter = null;
//遍历target对象所实现的所有方法
for(Class superInterface: target.getClass().getInterfaces()){
try{
//获取设置注入所需要的setter方法
setter = bean.getClass().getMethod("set"+propNameCamelize, superInterface);
//如果成功获取,跳出循环
break;
}catch (Exception e) {
//如果没有找到就继续下次循环
continue;
}
}
//如果setter方法依然是null,直接取得target的实现类对应的setter方法
if(setter == null){
setter = bean.getClass().getMethod("set"+propNameCamelize, target.getClass());
}
//执行setter注入
setter.invoke(bean, target);
} }
} }
}
}
模拟Spring中applicationContext.xml配置文件初始化bean的过程的更多相关文章
- ssh整合思想初步 struts2与Spring的整合 struts2-spring-plugin-2.3.4.1.jar下载地址 自动加载Spring中的XML配置文件 Struts2下载地址
首先需要JAR包 Spring整合Structs2的JAR包 struts2-spring-plugin-2.3.4.1.jar 下载地址 链接: https://pan.baidu.com/s/1o ...
- web.xml中配置Spring中applicationContext.xml的方式
2011-11-08 16:29 web.xml中配置Spring中applicationContext.xml的方式 使用web.xml方式加载Spring时,获取Spring applicatio ...
- 关于Spring中applicationContext.xml配置错误“org/springframework/transaction/interceptor/TransactionInterceptor”的问题解决
问题描述: 在配置spring的applicationContext.xml中的默认事务管理器的时候可能会出现这样的错误: Error occured processing XML 'org/spri ...
- Spring中applicationContext.xml详解
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 关于spring的applicationContext.xml配置文件的ref和value之自我想法
今天在做SSH的一个项目的时候,因为需要定时操作,所以就再sping里面加入了一个quartz的小定时框架,结果在运行时候,发生了一个小bug. Caused by: org.springframew ...
- Spring中applicationContext.xml的bean里的id和name属性区别
转自:http://www.cnblogs.com/ztf2008/archive/2009/02/11/1388003.html <beans><bean id="per ...
- STS中applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Spring中,applicationContext.xml 配置文件在web.xml中的配置详解
一.首先写一下代码结构. 二.再看web.xml中的配置情况. <?xml version="1.0" encoding="UTF-8"?> < ...
- Spring中ApplicationContext加载机制和配置初始化
Spring中ApplicationContext加载机制. 加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet. ...
随机推荐
- CF451E Devu and Flowers(容斥)
CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...
- db2数据库还原
1.建好数据库比如TEST,建的时候将codepage设为与目标备份的codepage一致,比如: 437 2.然后备份一下刚建好的数据库,备份成功后,将20141127目录删除,然后将原来备份好的 ...
- (转)FFMPEG解码H264拼帧简解
http://blog.csdn.net/ikevin/article/details/7649095 H264的I帧通常 0x00 0x00 0x00 0x01 0x67 开始,到下一个帧头开始之前 ...
- rails常用函数
1.rails g controller Users rails g model User 2.user.reload.email reload 使用数据库中的数据重新加载对象
- 如何写PHP规范注释
所有的文档标记都是在每一行的 * 后面以@开头.如果在一段话的中间出来@的标记,这个标记将会被当做普通内容而被忽略掉. @access 该标记用于指明关键字的存取权限:private.p ...
- pygame躲敌人的游戏
#first.py# coding=utf- import pygame from pygame.locals import * from sys import exit from util impo ...
- 如何彻底禁止手机连接usb,代码实…【转】
本文转载自:https://blog.csdn.net/jun4331247/article/details/51201825 作为系统第三次被黑的修复方法,捯饬了半天,没效果,最后大神一出手,果然出 ...
- Linux电源管理(1)-整体架构【转】
本文转载自:http://www.wowotech.net/pm_subsystem/pm_architecture.html 1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长, ...
- Java,Hibernate,标准sql数据类型之间的对应表
(2010-07-14 19:53:50) 转载▼ 标签: 杂谈 分类: JAVA Hibernate API简介 其接口分为以下几类: l 提供访问数据库的操作的接口: l ...
- 遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题
在将数据库从sqlserver2000迁移到2005后,原有的用户名TDS在执行存储过程是报错:“拒绝了对对象的 EXECUTE 权限”. 如网上所说,在使用的数据库的属性页->权限中给TDS添 ...