MetaData Programme

8.5/Q1,Charls最新高分文章解读! 8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。 阅读详情

(本文发于java emag第二期)
什么是元数据编程

什么是元数据,元数据就是描述数据的数据(data about data)。最明显的例子是XML Schema,xml schema就是描述xml的数据,所以它是元数据。另一个例子是数据库,比如我们可以查询数据库中有几个表,每个表都有什么字段,这些数据就是元数据。

在开发的世界里,元数据就是能够绑定到一个类的附加信息,在静态或者运行时间。JCR175给我们提供annotation就是一种元数据。

不过在这之前一个我们已经广泛使用的元数据是XML,如就是EJB的XML发布描述符中,你需要定义基于每一个方法的事务属性。应用服务器指导什么时候,什么地方开始,挂起或者提交一个事务,因为你在BEAN的XML的配置文件中的元数据内已经定义如方法:Required,RequiresNew,Support等等,它们绑定在你的EJB类和事务管理之间。XDoclet是另一个元数据的例子。

 

Annotation的意义和简单例子

    JDK1.5提供的annotation与我们所常见的classes、fieldss和methods间是什么关系。如下:如果说类和数据成员是名词,方法是动词,那么annotation就是形容词或者副词,分别描述它们的所具有属性。

好,现在就来实现一个annotation

import java.lang.annotation.Retention;

package sample.annotation;

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)

    public @interface Broker {

        String name();

        String address();

    }

}

使用这个annotation

Import sample.annotation.broker;

@Broker(name="anders", address="xiamen")

public class Agent {

    public String getTelPhone (){

       return  "010-0592-2519280";

    }

}

运行期得到这个annotation

public class Main {

    public static void main(String[] args){

Agent agent = new Agent();

        try{

            Annotation[] a = agent.getClass().getMethod("getBrokerName").getAnnotations();

            for (int i=0; i<a.length ; i++)  {

                 if( a[i] instanceof Broker){

                      Broker broker = (Broker)a[i];

                     System.out.println(broker.name());

                 }

             }

        }

        catch(Exception e){

            e.printStackTrace(System.out);

        }

   }

}

 

Annotation的class文件格式

    利用sun公司的提供的javap,我们可以看到annotation的在class文件中的表示。以下为对比结果:

源码:

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)

public @interface Broker {

    String name();

    String address();

}

Javap结果:

Compiled from "Broker.java"

interface Broker extends java.lang.annotation.Annotation

  SourceFile: "Broker.java"

  minor version: 0

  major version: 0

  Constant pool:

const #1 = class    #9;  // Broker

const #2 = class    #10; // Object

const #3 = class    #11; //Annotation

const #4 = Asciz    name;

const #5 = Asciz   ()Ljava/lang/String;;

const #6 = Asciz    address;

const #7 = Asciz    SourceFile;

const #8 = Asciz    Broker.java;

const #9 = Asciz    Broker;

const #10 = Asciz   java/lang/Object;

const #11 = Asciz   java/lang/annotation/Annotation;

 

{

public abstract java.lang.String name();

 

public abstract java.lang.String address();

}

源码:

public interface Broker {

    String name();

    String address();

}

Javap结果:

Compiled from "Broker.java"

interface Broker

  SourceFile: "Broker.java"

  minor version: 0

  major version: 0

  Constant pool:

const #1 = class    #8; //  Broker

const #2 = class    #9; //  Object

const #3 = Asciz    name;

const #4 = Asciz    ()Ljava/lang/String;;

const #5 = Asciz    address;

const #6 = Asciz    SourceFile;

const #7 = Asciz    Broker.java;

const #8 = Asciz    Broker;

const #9 = Asciz    java/lang/Object;

 

{

public abstract java.lang.String name();

 

public abstract java.lang.String address();

 

}

源码:

@Broker(name="anders", address="xiamen")

public class Agent {

    public String getTelPhone(){

        return  "0592-2519580";

    }

}

Javap结果:

Compiled from "Agent.java"

public class Agent extends java.lang.Object

  SourceFile: "Agent.java"

  RuntimeVisibleAnnotations: length = 0x10

   00 01 00 11 00 02 00 12 73 00 13 00 14 73 00 15

  

  minor version: 0

  major version: 0

  Constant pool:

const #1 = Method   #4.#22; //  java/lang/Object."<init>":()V

const #2 = String   #23;    //  0592-2519580

const #3 = class    #24;    //  Agent

const #4 = class    #25;    //  Object

const #5 = Asciz    <init>;

const #6 = Asciz    ()V;

const #7 = Asciz    Code;

const #8 = Asciz    LineNumberTable;

const #9 = Asciz    LocalVariableTable;

const #10 = Asciz   this;

const #11 = Asciz   LAgent;;

const #12 = Asciz   getTelPhone;

const #13 = Asciz   ()Ljava/lang/String;;

const #14 = Asciz   SourceFile;

const #15 = Asciz   Agent.java;

const #16 = Asciz   RuntimeVisibleAnnotations;

const #17 = Asciz   LBroker;;

const #18 = Asciz   name;

const #19 = Asciz   anders;

const #20 = Asciz   address;

const #21 = Asciz   xiamen;

const #22 = NameAndType #5:#6;//  "<init>":()V

const #23 = Asciz   0592-2519580;

const #24 = Asciz   Agent;

const #25 = Asciz   java/lang/Object;

 

// 以下为方法域,略

源码:

public class Agent {

    public String getTelPhone(){

        return  "0592-2519580";

    }

}

Javap结果:

Compiled from "Agent.java"

public class Agent extends java.lang.Object

  SourceFile: "Agent.java"

  minor version: 0

  major version: 0

  Constant pool:

const #1 = Method   #4.#16;    //  java/lang/Object."<init>":()V

const #2 = String   #17;    //  0592-2519580

const #3 = class    #18;    //  Agent

const #4 = class    #19;    //  Object

const #5 = Asciz    <init>;

const #6 = Asciz    ()V;

const #7 = Asciz    Code;

const #8 = Asciz    LineNumberTable;

const #9 = Asciz    LocalVariableTable;

const #10 = Asciz   this;

const #11 = Asciz   LAgent;;

const #12 = Asciz    getTelPhone;

const #13 = Asciz    ()Ljava/lang/String;;

const #14 = Asciz    SourceFile;

const #15 = Asciz    Agent.java;

const #16 = NameAndType    #5:#6;//  "<init>":()V

const #17 = Asciz    0592-2519580;

const #18 = Asciz   Agent;

const #19 = Asciz    java/lang/Object;

 

// 以下为方法域,略

 

补充说明:我们都知道在java 1.0发布时,java class file的格式就已经定下来,要说明的是为了应未来的需要java class file设计了属性说的机制。一直到j2se1.4都没有怎么改变。但这次为了更好的支持metadata技术,一共增加了8个属性。分別是:

·           「EnclosingMethod」 Attribute:Anonymous Class 或 Local Inner Class 使用此 Attribute 描述该Class 的Scope。

·           「Signature」 Attribute:Generics 的 Class、Method、或 Filed使用此 Attribute 来记录所要的类型,因为java的范型采用了擦拭法。

·           「LocalVariableTypeTable」 Attribute:主要是給 debugger 使用,目的和「LocalVariableTable」 Attribute类似,只是「LocalVariableTable」 Attribute 记录所要的参数表,而「LocalVariableTypeTable」 Attribute 记录参数的类型。

·           「RuntimeVisibleAnnotations」 Attribute:确定该annotation可以被reflection的API返回,适用对象:Class、Method、Field

·           「 RuntimeInvisibleAnnotations」 Attribute:确定该annotation无法被reflection的API返回,适用对象: Class、Method、Field。  

·           「 RuntimeVisibleParameterAnnotations」 Attribute:同「RuntimeVisibleAnnotations」 Attribute,适用对象:Method,(该Method 的参数

·           「 RuntimeInvisibleParameterAnnotations」 Attribute:同「RuntimeInvisibleAnnotations」 Attribute,适用对象:Method,(该Method 的参数。

·           「AnnotationDefault」 Attribute:适用对象:Method,记录默认值。

 

 

为什么需要Annotation

    在annotation之前我们已经广泛使用另外一种元数据xml,为什么需要annotation。Annotation与xml的作为元数据的区别是什么——位置。Annotation写在源代码中,而xml写在外部。

    为什么要这样?如果你开发过EJB,你一定为你的EJB写过xml描述文件。当大量的EJB需要描述时,就出现了所谓的"descriptor hell"。这个也导致了著名的XDoclet的出现。而annotation出现可以避免这种descriptor hell。另外你更改了某个方法为其增加或者减少一个参数,你就对应的修改xml文件,而使用annotation则不必。使用annotation将开发和部署更方便,提供开发效率。

    另外:使用xml的另一个问题是:很多Xml配置太过verbose。相比较EJB和Hibernate 或者Webwork可以明显的发现不同。

 

再议Annotation

在EJB3中,Annotation把开发和部署的工作合在一起。但是在一些企业环境中,开发人员并不控制诸如数据源名等(这些是部署部门和管理部门的工作),这样把数据源名写在xml中将比较好。

    Annotation是本身静态的,一旦添加或者修改annotation都需要重新编译,在运行时读取,这样就丧失了运行时配置的能力。因此Annotations 不会取代xml,它只是提供了另一种途径。并且我相信sun公司将在未来提供一个方式可以在运行期更改metadata。

关于这点TSS上有着很激烈的讨论,很多开发人员提出:利用xml来更改annotation,并希望类似的方式能被采纳为标准规范。比如使用如下格式:

<class name="org.hibernate.Item">

@Entity

    @Table(name="AUCTION_ITEM")

    <method sig="getBar()">@Transient</method>

    <method sig="doSomething(int, String)">

        @Tx(REQUIRES_NEW)

    </method>

</class>

 

  当然也有不同意见:But then, I think of "overriding" as a different problem to "xml deployment descriptors", and so I think we need two solutions. I think Cedric and Bill are trying to kill two birds with one stone, so maybe their proposals are better....

关于为annotation提供动态配置能力的问题,其中一个网友认为:Sun make it real pain to do the deployment XML so that they can introduce annotation to fix it. The annotation can make code/deployment coupling so strong that Sun can come out with a new way (annotation interceptor in jdk 1.6? :)) for fixing it. and the cycles goes on...这让我想起了类似的现象:JSP和TagLib。希望Annotation不会和TagLib有同样的命运。

Annotation本身引入另一种类型的接口。在EJB3中确实使程序更加POJO,也消除了一些接口。并且编译后的代码也可以直接移植到另一个并不处理这些annotations的环境中(感谢VM在加载类时并不检查那些annotations的classes,甚至这些类不在classpath中)。然而代码也确实增加了另一些接口。这个表现在编译期,如果没有这些annotation classes,是编译不过的。

    另一个问题(还好不算很重要),关于annotation的namespace。在多层应用的系统中,可能会出现同样的全局annotation的namespace冲突。比如一些公共的annotation,如@Transaction,将会被应用在很多个层次中。尽量让namespace长些,可以避免这个问题。

 

元数据编程的应用:

Annotation已经被集成到很多的java规范和标准中,很重要的是它已经被J2EE标准,如EJB3所采用,当然也被许多开源的组件体系如:AspectJ。

    Annotation最重要的应用将是AOP:由于annotation可以天然的表示系统中的另一个横切面,同时Annotation的识别是通过反射得到的,所以Annotation很自然的应用到基于动态代理的AOP实现。AOP-Alliance也支持metadata handling。AspectJ也发布了基于annotation的新版本。

    在实现AOP上,使用annotation也比使用XML有一个优势:如前所述,annotation更像是形容词和副词,这样比较不容易verbose。当然这个是相对的,在实际的实现中更依赖开发人员的努力。

    这里,笔者将展示一个不完整也不成熟的基于annotation的AOP例子代码——关于银行卡的例子。

    功能需求:银行卡业务分为转帐,查询余额,查询明细,POS消费等。这其中转帐和POS消费是要收费的(转帐收取的是用户的手续费,而POS消费收取的是商家的手续费),另外POS消费还可能有积分的(比如笔者的牡丹贷记卡)。消费转帐都要记录明细。但查询余额就不需要记录下明细中。

    代码如下(在这个例子没有用动态代理也没有用已有的AOP框架,使代码看起来简单些)

// 银行卡对象

public class Card {

    private String account;

//some field method

}

Annotation:

// 手续费

// type= "user", 表示收取用户手续费; type= "Biz", 表示收取商家手续费

public @interface Fee{

    String type();

}

// 积分

public @interface Index {

}

// 记录明细

public @interface BizLog {

}

// 事务处理

public @interface Transaction {

}

// 业务接口

public interface BizAction {

    void execute(Card card, RunData rundata);

}

// 转帐业务

@Fee(type="user")

@Transaction

@BizLog

public class TransferAction implements BizAction  {

    public void execute(Card card, RunData rundata) {

        //To change body of implemented methods use File | Settings | File Templates.

    }

}

// POS消费

@Fee(type="Biz")

@Transaction

@BizLog

@Index

public class POSAction implements BizAction {

    public void execute(Card card, RunData rundata) {

        //To change body of implemented methods use File | Settings | File Templates.

    }

}

// 查询明细

public class QueryDetail implements BizAction {   

    public void execute(Card card, RunData rundata) {

        //To change body of implemented methods use File | Settings | File Templates.

    }

}

// 业务操作监视器接口

public interface BizActionMonitor {

    void execute(BizAction action, RunData rundata);

}

// 业务操作监视器实现

public class BizActionMonitorImpl implements BizActionMonitor{

    public void execute(BizAction action, RunData rundata) {

        Annotation[] annotations = action.getClass().getAnnotations();

        for(Annotation annotation : annotations){

            if (annotation instanceof Fee){  // 计算手续费   }

            if (annotation instanceof Index){ //计算积分    }

            if (annotation instanceof Transaction){ // 准备事务  }

            if (annotation instanceof BizLog){ // 记录明细   }

        }

    }

}

// 控制器对象

public class controller{

    private BizActionMonitor monitor;  

    public void execute(BizActionUI, rundata){

        BizAction action = getAction(BizActionUI);     

        monitor.execute(action, rundata);

    }

}

// 运行时数据

public interface RunData {

   // some method

}

// 用户设备(POS机, ATM或者柜台终端)接口

public class BizActionUI {

      private RunData rundata;

      private Controller controller;

      public BizActionUI(RunData rundata, Controller controller){

          this.rundata = rundata;

          this.controller = controller;

      }

      public void execute(){ // 某个子类实现  }

      public void commit(){

          controller.execute(this, rundata);

      }

}

public class Main{

    private Rundata rundata;

    private Controller controller; 

    public populateUI(command){

        BizActionUI ui = getUI(command);

        ui.execute();

    }  

    public BizActionUI getUI(command){

        //...

        BizActionUI ui

        if( //....){

            ui = new SomeBizActionUI(rundata, controller);

        }

        return ui;     

    }   

    public static main(String[] args){

        //...

        Main main = new Main();

        main.populateUI(command)

        //...

    }

}

 

结束语:本文讨论了annotation技术,展示了annotation的class文件格式,并讨论了annotation技术本身的优势和不足,并于现有的xml技术加以比较,展望了annotation技术的应用前景AOP。

限于笔者自身的水平(包括技术水平和写作水平),技术上对annotation的学习比较有限,写作上也感觉好多话无法用文字来表达,因而本文的代码会比较多(大概有一半以上)。
PyQt5简介和安装 在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。 阅读详情

相关推荐

实测|龙虾机器人(OpenClaw)Windows系统部署全攻略(含避坑指南)

先简单科普下:龙虾机器人本质是一款开源AI代理框架,核心优势是“能行动、可本地、高灵活”——它不内置大模型,需要对接第三方AI接口(如GPT、Claude、阿里云百炼等),但能将AI的指令转化为实际的系统操作,相当于给AI配了一个“能动手的身体”,这也是它和普通对话大模型的核心区别。今天就结合自己的实测经历,从环境准备、分步部署、初始化配置,到常见问题排查,写一篇保姆级攻略,不管是新手还是有一定技术基础的同学,都能跟着一步步完成部署,少走弯路~解决方案:检查聊天软件插件是否安装成功,权限是否配置完整;

wohaiweifaju的博客 1万+

JDK 1.5 特性使用实例5--metadata

 定义一个metadata . Test.java package maoxiang.examples.jdk15.metadata; import java.lang.annotation.*; /*** Indicates that the annotated method is a test method.* This annotation should

jTeam的专栏 1229

Redhawk解析PAD / IOPAD的实现方法

Redhawk解析IOPAD的实现方法1. IOPAD DEF的概念说明2. 生成 IOPAD GDS文件3. 生成 IOPAD DEF文件4. Redhawk解析过程中读取IOPAD DEF 本文主要简述【Redhawk解析IOPAD】的实现原理方法,具体脚本没有放在这里。 1. IOPAD DEF的概念说明 2. 生成 IOPAD GDS文件 注: getinfo2IODEF.tcl 是基于innovus获取IOPAD的摆放信息以及库信息。 run_cerate_iopadgds.csh 是基于c

kobayashiyou的博客 3155

MetaData Programme -jdk1.5

MetaData Programme作者:Anders小明1.1.        什么是元数据编程什么是元数据,元数据就是描述数据的数据(data about data)。最明显的例子是XML Schema,xml schema就是描述xml的数据,所以它是元数据。另一个例子是数据库,比如我们可以查询数据库中有几个表,每个表都有什么字段,这些数据就是元数据。在开发的世界里,元数据就是能够绑定到一个

简简单单,平平淡淡 1475

从音频录制到智能手表:Sigma-Delta ADC是如何在低功耗场景下‘欺骗’噪声的?

本文深入解析Sigma-Delta ADC在智能穿戴设备中的低功耗高精度实现原理,重点介绍其通过过采样和噪声整形技术‘欺骗’噪声的独特方法。以TWS耳机和医疗级健康监测为例,展示该技术如何在有限功耗预算下实现专业级信号采集,为消费电子设计提供关键解决方案。

weixin_30825581的博客 389

Pytest 常见问题及其解决方案

Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。

qq_52137592的博客 900

DW:AOP and metadata: A perfect match

http://www-128.ibm.com/developerworks/java/library/j-aopwork3/一篇关于AOP与Metadata Programme的优秀文章,IBM的评级是Intermediate。推荐大家阅读。(想起自己也写过同主题的文章,那个汗啊!)

Anders小明的Blog 1536

STM32F407 UART4串口DMA收发实战:告别频繁中断,用空闲中断+DMA搞定不定长数据

本文详细介绍了STM32F407 UART4串口结合DMA和空闲中断实现高效不定长数据收发的实战方案。通过DMA硬件级数据搬运和空闲中断智能帧检测,显著降低CPU占用率,提升通信效率,适用于工业传感器数据采集和智能设备通信场景。

weixin_42631411的博客 155

Cannot resolve scoped service 'dbContext' from root provider

在programme.cs 里面加入 .UseDefaultServiceProvider(options => { options.ValidateScopes = false; })

张峰的博客 3133

TortoiseSVN的安装与使用

TortoiseSVN的安装与应用1、安装1.1、下载TortoiseSVN    点击下载TortoiseSvn1.2、下载汉化包。上面的页面中,找到Chinese, simplified汉化包,点击32位或者64位的Setup,下载汉化包。1.3、安装TortoiseSVN。在选择安装路径页面时要记得勾选“command line client tools”,默认不是勾选的。这里不勾选的话在I...

qq_28566071的博客 4万+

前程无忧Python岗位数据采集:基于API直连的高效招聘信息爬取实战

本文介绍了一个基于Python requests库的前程无忧招聘数据采集系统。项目通过分析API接口结构,配置完整的请求头和身份验证参数,实现了高效稳定的数据采集。系统支持多页数据批量获取,包含工作名称、薪资范围等关键字段的结构化解析,并将结果存储为Excel文件。技术实现涉及API分析、身份验证、请求头配置、数据清洗等关键步骤,同时强调遵守法律和道德规范。该系统可为求职者、HR和市场分析师提供有价值的行业数据支持,适用于市场分析、职业规划等场景。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1552

如何定义和建立架构

任何系统都有架构,无论多小的系统都有,区别在于其架构是否是经过明确设计并表达。一个合理的架构无疑是经过精心设计和维护的,如何定义和建立架构,本文分享一些实践和思考,希望能抛砖引玉。

Anders小明的Blog 7342

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1675

开发式编程,声明式编程和产生式编程

Programmatic programming, Declarative programming and Generative programming开发式编程,声明式编程和产生式编程Author:Anders小明同步自:http://www.blogjava.net/AndersLin/archive/2006/08/31/66968.html开发式编程是编码的,如:Java, C#声明式

Anders小明的Blog 4751

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

业务流程的层次和内容

Author:Anders小明(2008-1-12更新)业务流程依据不同层次分为3个0. 领域流程领域流程即领域对象生命周期,是流程中的核心;1. 工作流程工作流是处理多人协同工作,三权分立的过程;该过程是建立在领域对象生命周期上;生命周期的不同状态在工作流中都有映射;工作流处理的是领域中Request对象的生命周期;2. 页面流程页面流是处理工作中一个工作请求的分步申请;该过程建立在

Anders小明的Blog 4158

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

软件架构乱弹——问题域及其解决方法

作者:Anders小明(2007.12.14日补充更新了部分内容,其中有关Web网站性能特点部分内容来自网络) 一、什么是架构1. 和架构相关的几个问题域架构需要解决的非业务问题域包括如下:A 系统目标:系统性能,稳定性.B.项目目标:开发成本,质量C.项目过程:需求的不确定性和开发过程的团队协作性不同的问题域,解决之道也不相同!而同一问题域的不同层次的要求,解决之

Anders小明的Blog 4158

基于抽象的分层结构

基于抽象的分层结构Author:Anders小明(2008-1-8更新)前言:现有已知的分层结构基本上是基于技术结构的,无论是SpringSide(早的还有AppFuse)还是DDD提出的分层结构,都是基于职责角色划分的。然而对于复杂的企业应用系统来说,仅仅以该纬度来划分,是无法完成逻辑的分解的。我们还需要基于抽象的分层纬度。基于抽象的分层结构众所周知:抽象是有排列的。进一步,在企业应用中,抽象的

Anders小明的Blog 3278

AspectJ: 通往AOSD之路的最佳军火

同步自:http://www.blogjava.net/AndersLin/archive/2006/06/24/54806.html在AOSD:应用AOP实现业务逻辑中, 我提出关注的接口; 其原文在javaeye上的讨论狼平方也提出可以用event,或者intercepter。 当然不同的方式可以解决不同的问题。这里要讨论一下AspectJ和Event以及intercepter的不同。

Anders小明的Blog 3223

AOSD的实践冲动:Use Case的实现

 Author:Anders小明目前采用是面向对象设计方法,设计的粒度分为两级:类和方法(属性),类似于数据库设计的表和字段;在现有实现体系下,一个方法内部将包容多个Use Case;同时因为Use Case本身的横向扩展,也会导致一个Use Case将关联到多个方法;这是一个多对多的关系,为我们的开发管理带来巨大的成本。为了有效管理Use Case及其实现映射,AOP技术成为一个好的

Anders小明的Blog 2868

软件工程中的经济行为与软件架构师的工作

Author:Anders小明软件工程中的经济行为1. 在传统财务概念下,软件公司或者商业公司IT部门的员工,是公司的成本中心。对于一个定额合同项目,员工工资成为项目中唯一的可变成本。2. 因此,尽可能的缩短工期,减少人员投入就成为缩减成本的基本方式。3. 软件的分工模式,以及传统的waterfall——流水线的工作方式,决定了问题发现的越早,修正的成本越低。4. 有两种手段来减少工期,工程上

Anders小明的Blog 2688

基于业务模块组件的系统架构

 Author:Anders小明以前写过一篇《基于抽象的分层结构》,这里补充一篇《基于业务模块组件的系统架构》一些内容在《项目笔记:dao,web,模块边界以及Model分类》以及《模块的接口设计》随笔中已经提到,这里补充总结一下。任何一个有一定规模系统,通常会把系统做一定分解降低分析设计开发的难度,模块划分是一个比较常见的方式。而在模块的划分及其分析设计的实践中,包括了两种层次的边界。第一是

Anders小明的Blog 2647

DSL(Domain Specific language): How to get it

同步自:http://www.blogjava.net/AndersLin/archive/2006/07/08/57222.html在DSL:基于规则系统组织业务规则我提出DSL,不过在该文没有太多关于DSL的东东,显得有些牵强。先要说明一下什么是DSL(Domain Specific language),援引《产生式编程》一文: “DSL(领域特定语言)是一种特化的,面向问题的语言。” 《产生

Anders小明的Blog 2468

业务行为的分析和设计

业务行为的分析和设计       Author:Anders小明       同步自:http://www.blogjava.net/AndersLin/archive/2006/12/23/89648.html         复杂业务行为通常看作是复杂规则与流程的集合。解决的基本方法依赖基本的思考方式:分解结构。分解的第一要素是:面向对象——内聚。通常面向对象理论会告诉我们设计的设计原

Anders小明的Blog 2047

浅谈基础平台

作者:Anders小明2009年5月5日  一、什么是基础平台基础平台对应于业务应用,主要处理技术问题,是为业务应用提供技术支撑以及技术方案的模块或者组件。其目的是使得应用组件可只关注于业务逻辑,而不考虑或者少考虑技术问题。基础平台通常包括如下:基础功能,开发类库,开发模式以及开发部署工具。 二、为何要基础平台应用系统的设计可以说是将一个业务语言翻译成程序语言的过程,这

Anders小明的Blog 1970

企业应用下的业务组件开发实践

作者:  Anders小明 什么是企业应用下的业务组件首先,这是一个组件,这意味着它需要在容器里运行,因此不包括任何中间件服务,同时以一定结构(文件结构或者压缩格式)组成,被容器识别;其次,这是一个业务组件,即提供的是应用服务,而非技术服务;第三,这是企业应用,在业务上包括功能和服务(Service,当前最时髦的说法,你可以理解为API),技术上(以J2EE来讲)包括:UI资源(JSF、J

Anders小明的Blog 1948

浅谈企业应用架构(一)

作者:Anders小明2009年5月5日  一、什么是架构在牛津高阶词典(第7版)中,架构(architecture)一词的解释是:the design an structure of a computer system,而架构师(architect)一词的解释是:a person who is responsible for planning or creating an idea, a

Anders小明的Blog 1894

浅谈企业应用架构(二)

五、架构的技术层面(一)基础手段提高开发效率和品质的基本手段是分解——即充分的分离系统中不同的关注点,好处不用说了,可以并发的工作,每个人面对的问题都简单而容易操作。而与分解对应的集成,只有提供了好的集成能力,分解才成为现实,而只有分解了,才能清晰的提供业务更多适应性。分解和集成的手段分为编程语言和技术框架两个层面。所谓语言就是强框架,而框架就是弱语言。A. 开发语言现代面

Anders小明的Blog 1886
上一篇: ONJava: Designing a Fully Scalable Application
下一篇: Template和JSP技术
林仪明
博客等级 码龄25年 313粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值