`
wu.sheng
  • 浏览: 65832 次
  • 性别: 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  
哈哈,不错不错,下来试用一下,回头把体验告诉你

相关推荐

    certifymyrepo-back

    使用这些args: -Dspring.profiles.active =开发人员-DFTP_USERUSERNAME = crusoe -DFTP_PASSWORD = xxx -DCLIENT_ID = xxx -DCLIENT_SECRET = xxx -DMONGODB_USERNAME = crusoe -DMONGODB_PASSWORD = xxx MongoDB...

    Crusoe:装在瓶子里的现代信息

    Crusoe是一个基于位置的消息传递应用程序,用户可以在其中阅读其所在区域的消息并创建可以在世界上犹如大海一样四处徘徊的消息。 #Getting Started要开始使用:分叉,克隆或下载存储库。 然后,在终端中运行Meteor ...

    Robinson Crusoe

    鲁滨逊漂流记英文原版,可用来测试bloomfilter、KMP/BM、AC自动机、Trie树、Wu-manber算法的匹配效果.

    crusoe

    Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: yarn start 在开发模式下运行应用程序。打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。您还将在控制台中看到任何棉绒...

    linux 内核移植和根文件系统的制作

    中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、 Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III /Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、...

    jify:JSON索引文件数据库查询库工具

    吉菲 jify是用于查询大型(GB)JSON文件的实验性库/工具。 通过首先索引必填字段来完成此操作。... title : 'Robinson Crusoe' , year : 1719 , author : { name : 'Daniel Defoe' } } ) ; // Insert - Batch

    tiny-storage:一个很小的localStorage util

    小型存储一个很小的localStorage util安装npm ... set ( 'book-001' , 'Robinson Crusoe' ) ;store . set ( 'book-002' , "Grimm's Fairy Tales" ) ;store . set ( 'book-003' , 'Martin Eden' ) ;cart . set ( 'book-

    单片机与DSP中的微处理器的低功耗芯片设计技术

     2000年年初,Transmeta公司推出了 Crusoe处理器,以其独特的低功耗设计技术和非凡的超低功耗表现,在业界引起巨大轰动,引发了低功耗处理器设计的激烈竞争。 在2006年的英特尔开发者论坛大会(Intel

Global site tag (gtag.js) - Google Analytics