`
wu.sheng
  • 浏览: 66826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

组件包:org.studio.crusoe.framework 0.2.0

阅读更多

org.studio.crusoe.framework组件包,立足于平时J2SE和J2EE开发中常见运用场景,基于Java核心类库和成熟的第三方工具包,建立方便开发的功能性组件包。

组件包原型为开发过程中的工具类,进行重新的抽象、封装,使之成为跨系统、业务无关的组件。随时更新组件包更能,保证源码和使用示例源码的开发,利用空余时间解决大家使用过程中的问题,及时修复组件包BUG。

 

 

实现功能:

V 0.2.0

  1. AdviceClassFramework:整合AOP和IOC框架的API,使用配置文件进行类的增强和参数注入。
  2. 修复之前AOP框架代码中,对于增强使用*(星号)进行匹配时,无法正常识别的BUG。

AdviceClassFramework配置文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<class-configuration>
	<class id="BusinessTestClass"
		name="org.studio.crusoe.framework.aop.invokecontrol.BusinessTestClass"
		isSingle="Y">
		<attribute name="prp" type="java.lang.String" value="abcs-1"/>
		<advice>
			<patterns>
				<pattern>do*</pattern>
			</patterns>
			<intercepts>
				<intercept adviceClassId="MethodTestAdvice" />
			</intercepts>
		</advice>
	</class>

	<adviceClass id="MethodTestAdvice" name="org.studio.crusoe.framework.aop.intercept.MethodTestAdvice" />

	<extFile>web/WEB-INF/classes/AdviceTest_2.cfg.xml</extFile>
</class-configuration>

API示例:

AdviceClassFramework.load("web/WEB-INF/classes/AdviceTest.cfg.xml");
AdviceClassFramework.init();

BusinessTestClass busi2 = (BusinessTestClass) AdviceClassFramework
                .getClass("BusinessTestClass2");
busi2.doBusiness();//此方法受到方法增强影响
System.out.println(busi2.getPrp());//根据配置文件中的注入内容输出

 

 

V 0.1.4

  1. ExpressionSession:增加了对于表达式运算的支持,对第三方类库进行的包装。底层来自开源软件包:IKExpression,目前版本为2.1.0。GoogleCode开源项目:http://code.google.com/p/ik-expression/
    这里的封装是为了更适应项目使用的需要,未提供新的功能。

API接口示例:

ExpressionSession session = new ExpressionSession("\"Hello \" + edition");// edition是变量名,hello是字符串
session.setVariable("edition", "test expression");
System.out.println(session.excute());
session.setVariable("edition", "test expression-2"); //可以为变量设置新的值
System.out.println(session.excute());

ExpressionSession session = new ExpressionSession("(123+12) + edition");  //可以进行数字计算
session.setVariable("edition", 11); //注意变量值类型
System.out.println(session.excute());

 

 

V 0.1.3

  1. ForwardPattern:增加新的模式支持,可以根据执行模式ID,进行顺序执行。ForwardDispatch可以根据ID选择顺序链接进行执行。此模式主要用于执行顺序可能发生变更,或者可能需要动态添加新的执行顺序的场景。关于此执行顺序的链接关系一般在数据库或者配置文件中进行配置。这是十分常用的一种简单模式。

API接口说明:

    /**
     * 初始化forward模式调度信息
     * 
     * @param dispatchId
     *            forward模式调度id
     * @param forwards
     *            forward模式调度实例列表
     * @throws ForwardException
     * @author wusheng
     */
    public void initDispatch(String dispatchId, List<IForward> forwards) throws ForwardException;

    /**
     * 调度执行
     * 
     * @param dispatchId
     *            forward模式调度id
     * @param context
     *            本次调度执行上下文
     * @throws ForwardException
     * @author wusheng
     */
    public void dispatch(String dispatchId, IContext context) throws ForwardException;

 

 

API调用示例:

      ForwardDispatch dispatch = new ForwardDispatch();
        Forward_1 forward_1 = new Forward_1();
        Forward_2 forward_2 = new Forward_2();
        List<IForward> list = new ArrayList<IForward>();
        list.add(forward_1);
        list.add(forward_2);
        dispatch.initDispatch("testId", list);
        dispatch.dispatch("testId", null);

 

 

V 0.1.2

  1. IOC:增加IoC关于依赖反转的属性设置。由于本组件包不涉及配置方式和配置解析,所以IOC的实现,其实仅仅是对于属性的设置而已。org.studio.crusoe.framework.ioc.PropertyUtil提供此功能。同时,由于AOP中的ProxyClass已经支持对象单例缓存,所以,此处不需要再提供此功能。
  2. ThreadContext:提供线程独立的存储空间,基于ThreadLocal的封装实现。提供init、set、get方法分别进行当前线程上下文的初始化(即清空)、设置上下文、获取上下文。设置的上下文对象可以是任何对象。

IOC属性设置:

      //test为需要进行属性设置的对象实例
      PropertyUtil util = new PropertyUtil(test);
        //设置属性
      util.set("prp", "setProp");

        //获取属性
      System.out.println(util.get("prp"));

 

 

   BUG:

  1. V 0.1.1 版本中,由于String.format的函数使用错误,造成异常信息提示不完成。已修复。

 

V 0.1.1

  1. AOP:增加对于增强advicePatterns的支持。ProxyClassInfo构造函数可变参数advicePatterns发挥作用。多个匹配参数中,有一个符合匹配,方法会被增强。匹配方式符合正则表达式。

ProxyClassInfo示例:

 ProxyClassInfo proxyClassInfo = new ProxyClassInfo("BusinessTestClass",
                "org.studio.crusoe.framework.aop.invokecontrol.BusinessTestClass", Whether.YES,
                adviceList, "busi*", "do*");

此代理会增强以busi和do开头的方法。

 

V 0.1.0

  1. FtpConnector:基于sun.net类库的FTP连接辅助类,包含FTP的基本操作。
  2. StringUtil:字符串操作,进行判空和字符串比较
  3. CollectionUtil:集合操作,进行集合对象和数组判空
  4. Reflection/ForceReflection:基于sun标准反射机制的反射辅助类,包含反射实例化对象和反射方法调用,ForceReflection具有性能优势,但是需要注意运用场景
  5. FastReflection:基于CGLib的快速反射辅助类,包含反射实例化对象和反射方法调用,在反射速度上比ForceReflection更具有优势
  6. AOP:支持类似Spring的方法增强:执行前增强、执行后增强、环绕增强、异常增强。提供API的调用入口。在AOP相关API的帮助下,可以根据自身的运用场景,配置信息可以选择:配置文件、数据库、规则匹配等进行初始化和调用。

AOP API调用入口:

1.方法强化类的初始化

/**
     * 初始化方法强化实现类
   *  此方法在AOP框架初始化时调用
   * 
     * @param adviceId 方法强化类ID
     * @param adviceName 方法强化类类名
     * @author wusheng
     */
ClassProxyFactory.initAdvice(String adviceId, String adviceName);

 2.业务类的初始化

/**
     * 初始化业务类
     * 
     * @param classInfos 业务类描述信息
     * @throws Throwable
     * @author wusheng
     */
ClassProxyFactory.initProxy(ProxyClassInfo... classInfos);

 

业务类描述包含如下的信息

/**
 * 业务类类描述<br>
 * Title: org.studio.crusoe <br>
 * Description: <br>
 * Date: 2010-12-3 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public class ProxyClassInfo {
    /**
     * 业务类ID
     */
    private String classId;
    
    /*
     * 业务类类名
     */
    private String className;

    /**
     * 类实例引用
     * 只在单例模式下生效
     */
    private Object classInstance;

    /**
     * 是否单例
     * 默认为"是"
     */
    private Whether isLazy = Whether.YES;

    /**
     * 当前业务类,所需的增强类ID集合
     */
    private List<String> adviceList;
    
    /**
     * 增强方法匹配描述
     * V0.1.0未提供
     */
    private String[] advicePatterns;

/**
     * 业务类信息;构造函数
     * 
     * @param classId
     *            类ID
     * @param className
     *            类名
     * @param isLazy
     *            是否缓存单例
     * @param adviceList
     *            增强器列表
     * @param advicePatterns
     *            增强方法匹配描述(可选参数)
     */
    public ProxyClassInfo(String classId, String className, Whether isLazy, List<String> adviceList, String... advicePatterns);
}

 3.获取业务类响应的代理类 实例

/**
     * 获取代理类实例
     * 
     * @param classId
     * @return
     * @throws Throwable
     * @author wusheng
     */
ClassProxyFactory.getProxy(String classId)

 

增强接口:

1.执行前增强

/**
 * 方法执行前增强
 * Title: org.studio.crusoe <br>
 * Description: 在增强的方法执行前,会执行before<br>
 * Date: 2010-12-2 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public interface IMethodBeforeAdvice {
    public void before(Method method, Object[] args, Object obj) throws Throwable;
}

 

2.执行后增强

/**
 * 方法执行后增强
 * Title: org.studio.crusoe <br>
 * Description: 在增强的方法执行后,会执行after<br>
 * Date: 2010-12-2 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public interface IMethodAfterAdvice {
    public void after(Object returnObj, Method method, Object[] args, Object obj)throws Throwable;
}

 

3.环绕增强

/**
 * 方法执行增强
 * Title: org.studio.crusoe <br>
 * Description: 可在此接口实现类中控制方法是否执行,执行前后的处理逻辑<br>
 * Date: 2010-12-2 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public interface IMethodAdvice {
    public Object invoke(MethodInvocation invocation) throws Throwable;
}

 

4.异常增强

/**
 * 异常处理方法增强
 * Title: org.studio.crusoe <br>
 * Description: 在增强的方法抛出运行时异常时,会执行afterThrows<br>
 * Date: 2010-12-2 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public interface IThrowsAdvice {
    public void afterThrows(Throwable throwable);
}

 

AOP使用示例:

 测试增强类实现:

package org.studio.crusoe.framework.aop.intercept;

import java.lang.reflect.Method;

import org.studio.crusoe.framework.aop.invokecontrol.MethodInvocation;

public class MethodTestAdvice implements IMethodAdvice, IMethodBeforeAdvice, IMethodAfterAdvice,
        IThrowsAdvice {

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("method invoke advice");
        //throw new Exception();
        return invocation.invoke();
    }

    public void before(Method method, Object[] args, Object obj) throws Throwable {
        System.out.println("before advice");
    }

    public void after(Object returnObj, Method method, Object[] args, Object obj) throws Throwable {
        System.out.println("after advice:" + returnObj);
    }

    public void afterThrows(Throwable throwable) {
        System.out.println("exception advice");
    }

}

 

注:此处为了方便所以一个类实现了所有的增强接口,仅供测试使用。框架会根据实现的接口,决定对应的增强点。

 

模拟业务类

package org.studio.crusoe.framework.aop.invokecontrol;

/**
 * 业务测试类
 * Title: org.studio.crusoe <br>
 * Description: <br>
 * Date: 2010-12-3 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public class BusinessTestClass {
    /**
     * 业务测试方法
     * @return
     * @author wusheng
     */
    public String doBusiness(){
        System.out.println("start process business");
        return "business end";
    }
}

 

 

测试入口

package org.studio.crusoe.framework.aop.invokecontrol;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.studio.crusoe.framework.aop.constant.Whether;

/**
 * AOP框架逻辑测试 Title: org.studio.crusoe <br>
 * Description: <br>
 * Date: 2010-12-3 <br>
 * Copyright (c) 2010 Crusoe Studio <br>
 * 
 * @author wusheng
 */
public class ClassProxyFactoryTester {
    /**
     * 测试AOP的类配置和方法强化
     * 
     * @throws Throwable
     * @author wusheng
     */
    @Test
    public void proxyInvokeTest() throws Throwable {
        //初始化增强器
        ClassProxyFactory.initAdvice("MethodTestAdvice", "org.studio.crusoe.framework.aop.intercept.MethodTestAdvice");

        //业务增强类集合
        List<String> adviceList = new ArrayList<String>();
        adviceList.add("MethodTestAdvice");
        
        //设置初始化业务类描述信息
        ProxyClassInfo proxyClassInfo = new ProxyClassInfo("BusinessTestClass",
                "org.studio.crusoe.framework.aop.invokecontrol.BusinessTestClass", Whether.YES,
                adviceList);
        //初始化业务代理类
        ClassProxyFactory.initProxy(proxyClassInfo);
        
        //获取业务代理类实例
        BusinessTestClass busi = (BusinessTestClass)ClassProxyFactory.getProxy("BusinessTestClass");
        //业务方法执行,过程中之前设置的方法增强会发生作用
        busi.doBusiness();
    }
}

 

 

执行结果:

before advice
method invoke advice
start process business
after advice:business end

1
0
分享到:
评论
1 楼 dvd1231 2010-12-08  
哈哈,不错不错,下来试用一下,回头把体验告诉你

相关推荐

Global site tag (gtag.js) - Google Analytics