您的位置:首页 > 运维架构

AOP in Real World--1

2007-04-03 22:18 162 查看
http://rds.yahoo.com/_ylt=A0oGkjYkDxJGqHABboVXNyoA;_ylu=X3oDMTE4MDluNnU2BGNvbG8DdwRsA1dTMQRwb3MDMTAEc2VjA3NyBHZ0aWQDRjgyM18xMzk-/SIG=12gfunda4/EXP=1175675044/**http://cs.union.edu/SeniorProjectPage-2004/poster/Dalton.ppt

现实世界的面向方面应用
在大型系统中运用aosd技术
AspectJ案例研究
IBM Websphere
介绍AspectWerkz
商业采购的问题
讨论
什么是AOP的最好或最差用途?
是否有更好的工具(或增强版)对当前是必须的呢?
比较AspectJ和HyperJ的优势(同构 vs.异构)
IBM Websphere(企业应用服务器)
使用AOP解决中间件的复杂性问题
跨生产线使用策略
可选项使能
高效重构
其他的案例
QuO---编写自适应应用程序的服务质量
COMQUAD
同构横切关注点
同构关注应用连续性策略横切代码
跟踪和日志
划分责任时方面非常有用(组件开发员在代码中不用担心正交策略的实现)
监控和统计
错误捕捉
捕捉"throwing"连接点
方面驱动的异构策略
直觉上方面很适合实现诸如日志一类的任务
问题: 方面是否值得重构系统
IBM做了一些非面向方面代码的分析
WebSphere的Admin组件(发现355处错误--没有跟踪点,其中33%的FFDC入口错误)
WebSphere的运行时组件(错过跟踪点,其中17%的FFDC入口错误)
异构横切关注点
异构关注出现在多处,而且每处的行为都不同
使用方面执行有效的重构
分离系统的特征(EJB)
目标:创建重构的系统,EJB, 或非EJB
问题:大量的代码基难以找到EJB代码的钩子
重构过程: 关注点建模-->可视化-->基于关注点的查询-->重构(AO & OO)
重构过程---搜索连接点
public aspect EJBSupportSeparation {
pointcut inEjbSupport() {
within(T1) ||
within(T2) ||
...;
}

pointcut ejbSupportLink() {
call(* T1.*(..)) ||
call(* T2.*(..)) ||
...;
}

declare warning :
ejbSupportLink() && !inEjbSupport() :
"Link to EJB Support found.";
}

范例重构---Bank Account
public class Account {
private int _accountNumber;
private float _balance;

public Account(int accountNumber) {
_accountNumber = accountNumber;
}

public int getAccountNumber() {
AccessController.checkPermission(
new BankingPermission("accountOperation"));
return _accountNumber;
}

public void credit(float amount) {
AccessController.checkPermission(
new BankingPermission("accountOperation"));
_balance = _balance + amount;
}
}
添加空的方面和切入点
private static aspect PermissionCheckAspect {
private pointcut permissionCheckedExecution() :
(execution(public int Account.getAccountNumber())
|| execution(public void Account.credit(float)))
&& within(Account);

before() : permissionCheckedExecution() {
}
}
添加横切功能关注(添加warning)
// optional
declare warning:
call(void AccessController.checkPermission(java.security.Permission))
&& within(Account)
&& !within(PermissionCheckAspect)
: "Do not call AccessController.checkPermission(..) from Account";
// end optional

private pointcut permissionCheckedExecution() :
(execution(public int Account.getAccountNumber())
|| execution(public void Account.credit(float)))
&& within(Account);

before() : permissionCheckedExecution() {
AccessController.checkPermission(
new BankingPermission("accountOperation"));
}
方面重构之后的Bank Account
public class Account {
private int _accountNumber;
private float _balance;

public Account(int accountNumber) {
_accountNumber = accountNumber;
}

public int getAccountNumber() {
return _accountNumber;
}

public void credit(float amount) {
_balance = _balance + amount;
}

private static aspect PermissionCheckAspect {
private pointcut permissionCheckedExecution()
: (execution(public * Account.*(..))
&& !execution(String Account.toString()))
&& within(Account);
before() : permissionCheckedExecution() {
AccessController.checkPermission(
new BankingPermission("accountOperation"));
}
}
}
结论
AspectJ编译器同超过2w行的源文件工作
比没有方面的代码快10.5%
增加了30-50%的汇编时间,建立时间几乎没变.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: