自行打造实现控制反转容器(IOC)与面向方面编程(AOP)的轻量级Framework
Posted niulity
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自行打造实现控制反转容器(IOC)与面向方面编程(AOP)的轻量级Framework相关的知识,希望对你有一定的参考价值。
MyFramework之IoC部分
作者:牛超
Email/MSN:ncfire_msn@hotmail.com
QQ: 10867910
关键字(Keywords):面向对象(OOP)、框架(Framework)、反射(Reflection)、设计模式(Design Pattern)、扩展标识语言(XML)、依赖注入(Dependency Injection)、控制反转容器(IoC)、横切点(Pointcut)、面向方面编程(AOP)
使用桥接模式定义对象工厂,它只有一个行为,获取一个指定对象,即依照参数传递的名字从XML定义中组装一个与之匹配的规格对象。此构建方法的实现为整个框架的核心。
package myFramework;
public interface IBeansFactory {
public Object getObject(String aObjName);
}
接下来是代理对象工厂,即装备加载工厂,使用代理模式构造对象。目标要实现两个行为,即分别通过设置装备和安装拦截器创建代理对象以供前面的对象工厂所使用。
package myFramework;
public interface IProxyBeansFactory
{
public Object createProxyObject(Object proxy, IAdvice[] advices);
public Object createProxyObject(Object proxy, IProxyInterfaceHandler pohandle);
}
对XML文件操作采用JAVA DOM库,XML文档对象的获取功能也比较单一,直接使用单件模式封装在类XMLCommon中,如下代码:
package myFramework ;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class XMLCommon
{
private static XMLCommon xmlCmnObj ;
private static String resourceFileName;
private Document document;
private XMLCommon()
{
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
document=builder.parse(new File(getResourceFileName()));
document.normalize();
}
catch(Exception ex)
{
ex.printStackTrace() ;
}
}
//get the singleton instance 获取单件对象
public static XMLCommon getInstance()
{
if (xmlCmnObj == null)
{
xmlCmnObj = new XMLCommon() ;
}
return xmlCmnObj ;
}
//get the filename of xml resource 获取资源文件名
public static String getResourceFileName()
{
if (resourceFileName == null)
resourceFileName = "./entities.xml" ;
return resourceFileName ;
}
//set the filename of xml resource 设置资源文件名
public static void setResourceFileName(String fname)
{
resourceFileName = fname ;
}
//获取XML文档类,用于读取XML文件中的内容
public Document getDocument()
{
return document ;
}
}
本Framework的实现所依赖的基础理论是OOP重要特性——反射机制,因此如何利用反射和自省来创建、克隆对象并动态调用相关方法就显得尤为重要,所以封装一个反射工具包,整个Framework也就完成了一半,这里亦用单件模式来定义反射工具对象。
package myFramework ;
import java.lang.reflect.*;
import java.util.*;
public class Reflection
{
//singleton instance 单件实例对象
private static Reflection reflect = new Reflection() ;
public static Reflection getInstance()
{
return reflect ;
}
/**
* get the public property of one object 获取一个对象的公共属性值
*
* @param owner, fieldName
* @return object
* @throws Exception
*
*/
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
/**
* get the static property in public 获取公共静态属性
*
* @param className
* @param fieldName
* @return object
* @throws Exception
*/
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
/**
* whether the two parameter list is matched 判断参数列表2是否与列表1兼容
*
* @param para. of be defined
自行打造实现控制反转容器(IOC)与面向方面编程(AOP)的轻量级Framework
自行打造实现控制反转容器(IOC)与面向方面编程(AOP)的轻量级Framework