org.studio.crusoe.framework组件包,立足于平时J2SE和J2EE开发中常见运用场景,基于Java核心类库和成熟的第三方工具包,建立方便开发的功能性组件包。
组件包原型为开发过程中的工具类,进行重新的抽象、封装,使之成为跨系统、业务无关的组件。随时更新组件包更能,保证源码和使用示例源码的开发,利用空余时间解决大家使用过程中的问题,及时修复组件包BUG。
实现功能:
V 0.2.0
- AdviceClassFramework:整合AOP和IOC框架的API,使用配置文件进行类的增强和参数注入。
- 修复之前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
- 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
- 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
- IOC:增加IoC关于依赖反转的属性设置。由于本组件包不涉及配置方式和配置解析,所以IOC的实现,其实仅仅是对于属性的设置而已。org.studio.crusoe.framework.ioc.PropertyUtil提供此功能。同时,由于AOP中的ProxyClass已经支持对象单例缓存,所以,此处不需要再提供此功能。
- ThreadContext:提供线程独立的存储空间,基于ThreadLocal的封装实现。提供init、set、get方法分别进行当前线程上下文的初始化(即清空)、设置上下文、获取上下文。设置的上下文对象可以是任何对象。
IOC属性设置:
//test为需要进行属性设置的对象实例
PropertyUtil util = new PropertyUtil(test);
//设置属性
util.set("prp", "setProp");
//获取属性
System.out.println(util.get("prp"));
BUG:
- V 0.1.1 版本中,由于String.format的函数使用错误,造成异常信息提示不完成。已修复。
V 0.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
- FtpConnector:基于sun.net类库的FTP连接辅助类,包含FTP的基本操作。
- StringUtil:字符串操作,进行判空和字符串比较
- CollectionUtil:集合操作,进行集合对象和数组判空
- Reflection/ForceReflection:基于sun标准反射机制的反射辅助类,包含反射实例化对象和反射方法调用,ForceReflection具有性能优势,但是需要注意运用场景
- FastReflection:基于CGLib的快速反射辅助类,包含反射实例化对象和反射方法调用,在反射速度上比ForceReflection更具有优势
- 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
分享到:
相关推荐
2. 阅读59页的3a部分,并回答相关问题,如Robinson Crusoe等待什么,为何他把那人称为Friday等。 3. 完成课本59页3B部分,根据句子含义猜测单词,如火器、海洋交通工具、海中陆地、切割工具和痕迹等。 4. 小组成员...
使用这些args: -Dspring.profiles.active =开发人员-DFTP_USERUSERNAME = crusoe -DFTP_PASSWORD = xxx -DCLIENT_ID = xxx -DCLIENT_SECRET = xxx -DMONGODB_USERNAME = crusoe -DMONGODB_PASSWORD = xxx MongoDB...
1. 文本背景与主题:这个文件是一个八年级英语下册的学习教案,主要探讨的是《Robinson Crusoe》(鲁滨逊漂流记)这篇课文的内容。该书是丹尼尔·笛福的一部经典小说,讲述主角鲁滨逊在荒岛上的生存经历。 2. 词汇...
2. **WXP源端口**:为`processr.sys`, `amdk6.sys`, `amdk7.sys`, `p3.sys` 和 `crusoe.sys` 提供的源代码。 3. **shell\osshell\accessib\magnify 文件夹**:包含有关放大镜功能的源代码。 4. **base\fs\utils\dfrg...
2. **重点词汇**:`wonderland`(仙境),`treasure`(宝藏),`island`(岛屿),`crusoe`(克鲁索,指《鲁滨逊漂流记》的主角),`already`(已经),`yet`(还,已经),`classic`(经典),`choose`(选择),`...
- Robin's play部分,Robin扮演Robinson Crusoe,展示了角色扮演在学习中的应用,帮助学生理解故事情节和人物性格。 - Zip和Zoom的故事则强调了日常生活的时间规划,例如:`From Monday to Wednesday, I usually ...
丹尼尔·笛福(Daniel Defoe)的《鲁滨逊漂流记》(Robinson Crusoe);雪莱(Shelley)的政治抒情诗《西风颂》(Ode to the West Wind);华兹华斯(William Wordsworth)对诗歌的定义;简·奥斯汀(Jane Austen)...
首先,课程引入了六本经典的英文书籍:《Alice in Wonderland》(爱丽丝梦游仙境)、《Little Women》(小妇人)、《Treasure Island》(金银岛)、《Oliver Twist》(雾都孤儿)、《Robinson Crusoe》(鲁滨逊漂流...
9. **公共标识语及习惯用语**:提到了一些英文短语和名著,如"the good old days"(过去的美好时光),"Robinson Crusoe"(《鲁滨逊漂流记》)等,这些都是英语文化背景的一部分。 这些知识点对于学生备考和提高英语...
10. **《鲁滨逊漂流记》(The Adventures of Robinson Crusoe)**:丹尼尔·笛福的小说,讲述鲁滨逊在荒岛上的生存冒险,体现了人类的坚韧与智慧。 11. **《卖花女》(Pygmalion)**:乔治·伯纳德·肖的戏剧,后来被...
例如,Transmeta公司的Crusoe处理器以其独特的低功耗设计引起了业界关注,而英特尔的Merom和Conroe处理器则展示了在保持高性能的同时如何显著降低功耗。 未来,随着物联网、移动计算和边缘计算等领域的快速发展,微...
从给定的文件片段中,我们可以提取到几个关键词:Robinson Crusoe(鲁滨逊漂流记的主角,经济学上常用来说明自给自足状态),Marxism(马克思主义),以及transaction costs(交易费用)。这些词汇暗示了文档将围绕...
10. **island** - 岛屿,孤独的岛屿指的是Robinson Crusoe中的荒岛生活很艰难。 11. **actually** - 事实上,他实际上整个下午都在玩电脑游戏,而不是做作业。 12. **record** - 记录,他在跳高比赛中再次打破学校...
21. 《鲁滨逊漂流记》(ROBINSON CRUSOE):丹尼尔·笛福(Defoe, Daniel)的冒险小说,描绘了鲁滨逊在荒岛上的生存与自我发现。 22. 《徳伯家的苔丝》(TESS OF THE D'URBERVILLES):托马斯·哈代(Thomas Hardy)的悲剧...
Crusoe是一个基于位置的消息传递应用程序,用户可以在其中阅读其所在区域的消息并创建可以在世界上犹如大海一样四处徘徊的消息。 #Getting Started要开始使用:分叉,克隆或下载存储库。 然后,在终端中运行Meteor ...
例如,Robinson Crusoe等待的是什么,他为什么称那个人为Friday。 - 任务三:根据句子意思填空,如可以射击的东西是“gun”,在海上旅行的工具是“ship”,海中的陆地是“island”等。 - 任务四:阅读59页3a后,...
鲁滨逊漂流记英文原版,可用来测试bloomfilter、KMP/BM、AC自动机、Trie树、Wu-manber算法的匹配效果.
1. 时态运用:题目中的各小题主要考察了现在完成时态(Have/Has + 动词过去分词),如"Have you read Robinson Crusoe before?" 和 "Has he seen the movie So Young yet?",表示动作在过去某一时间开始并持续到现在...
- **x86架构**: 从最初的8086 (c.1978) 到现代的Pentium系列、AMD Athlon以及Transmeta Crusoe等,展示了从早期到现代的不同实现方式。 - **DLX架构**: 可以通过微程序控制、流水线以及超标量等方式实现。 - **...