AOP in Real World--1

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%的汇编时间,建立时间几乎没变.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值