`
Qieqie
  • 浏览: 341937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Annotation再阐释

阅读更多
Annotation再阐释

论坛之前就有阐释Annotation的:
<实战篇:设计自己的Annotation>http://www.iteye.com/topic/36659

我这里结合我的使用情况,简单再阐释一下:

Annotation能够对程序注入另外外的信息,有三个级别:代码级别,编译级别,运行时级别。

加注了Annotation的程序就是向三个级别“通知”你对“它”的“说明/注解”

比如:
java.lang.Override是代码级别的注解,你加注了,如果IDE支持这个“说明”,他能够知道你认为这个方法覆盖了父类。一旦该方法因为名字写错了,IDE能够知道你错误了。
javax.persistence.OneToMany是运行时级别的注解,你加注了,JPA能够知道你加注的目标是一个1对n的关系,并把你设定在这个方法上的OneToMany的注解信息读取出来是用,比如cascade策略,fetche策略,从而被JPA知道,让JPA知道不正是你的目的?

编译器的Annotation我没有用过,但与此类推,就是告知编译器我们对这个类、方法、字段等等的“说明”,编译器可以据此作一些你设定的处理。

Annotation在角色上分为:定义者、注解者、读者(我自己的语言,千万别被我悟倒)
定义者:定义Annotation类型。根据需要,任何人都可以创建新的Annotation. 比如你可能定义一个方法上注解叫:Permission,运行期级别。
注解者:是用已经定义的Annotation,只要定义了Annotation,你便可以使用它进行注解。比如 @Permission("/root/forum/java/post")
你定义了Annotation,并且对是用它用来注解。可是程序怎么知道按照我的意思执行它?
读者:读取你的Annotation说明,按照你的要求作事情。如果这个Annotation是由你自己来定义,那么这个读者也要由你实现。

我以Permission为示例如何实现一个读者:

1、实现一个PermissionInterceptor(extends MethodInvocation),当被拦截的方法注解了Permission,则调用权限中心判断当前调用者是否有该权限。
如何判断是否加注了Permission?-->Permission permission = method.getAnnotation(Permission.class); permission不为null便是。
如和知道当前调用者?-->参考ThreadLocal的使用
2、把PermissionInterceptor配置通过Spring或者其他支持AOP的容器中
3、配置哪些bean需要通过PermissionInterceptor拦截



这样一个Annotation例子就完整了。之后你认为那个方法要权限验证,就只需要加个Permission注解就可以了。

这个例子比较简单,权限验证的Annotation还可以更复杂,就不讨论了。

分享到:
评论
9 楼 卒子99 2007-05-13  
这个东东应该用于做框架,搞点类似于AOP框架应该不错吧
8 楼 Qieqie 2007-05-13  
Annotation天然和AOP具有合作精神(在我看来实在是绝配),AOP多用在Bo层的多,所以annotation在Bo层应用是自然而然的。

以下的Context代码,也是仅供参考(没有在eclipse调试,语法错误可能在所难免)

public class Context {
    private static ThreadLocal<Long> currentUsers = new ThreadLocal<Long>();

    private Context(){}

    //这个方法由Filter在请求达到时根据会话(e.g HttpSession,但不限于HttpSession)情况调用设置
    public static void setCurrentUserId(Long userId) {
        currentUsers.set(userId);
    }

    //这个方法,可被同一JVM中的任何其他方法调用。
    //返回当前请求者的Id,没有登录,则返回null
    public static Long getCurrentUserId() {
        return currentUsers.get();
    }

}
7 楼 lighter 2007-05-13  
Qieqie 写道
我的代码不在Web层,而在Bo层,参考如下:

public class PermissionInterceptor implements MethodInterceptor {  

    //PermissionManager提供权限验证服务,判断某人是否有某权限,他是个接口,定义了assertHasPermission方法
    private PermissionManager permissionManager;

    //getter,setter of permissionManager
     
    public Object invoke(MethodInvocation invocation) throws Throwable {   
        //Context封装了ThreadLocal,保存当前操作者Id,由Filter在请求进入的时候根据Session情况写入   
        Long userId = Context.getCurrentUserId();
        Method method = invocation.getMethod();

        Permission permission = method.getAnnotation(Permission.class); 

        if (permission != null) {
            if (userId == null) {
                //请求者还没有登录,允不允许他访问呢?
                   //code goes here, e.g: throw new LoginRequiredException();
              }
            String permissionStr = permission.value();
            //permissionManager负责验证是否有权限,如果没有权限,抛出ForbiddenException
            permissionManager.assertHasPermission(userId, permissionStr);
        }
        return invocation.proceed();
   }      
}



ForbiddenException和LoginRequiredException都是PermissionException的子类。
web层可以统一定制如果出现了PermissionException异常,则进行相关提示。

整个设计思路来源于Spring的 “事务管理器 + 事务拦截器” 模式,只是引入了Annotation而已。

了解到javaeye之前很多人对Annotation持保留态度,但各人有各人的具体情况和用法
怎么方便怎么用吧,天下太平。。。


昨晚那么晚还上技术论坛,头脑这么清楚的?
"//Context封装了ThreadLocal,保存当前操作者Id,由Filter在请求进入的时候根据Session情况写入  
    Long userId = Context.getCurrentUserId();
"
Context的代码可否贴一小段出来,用Annotation在Bo层的很少见!
6 楼 Qieqie 2007-05-13  
我的代码不在Web层,而在Bo层,参考如下:

public class PermissionInterceptor implements MethodInterceptor {  

    //PermissionManager提供权限验证服务,判断某人是否有某权限,他是个接口,定义了assertHasPermission方法
    private PermissionManager permissionManager;

    //getter,setter of permissionManager
     
    public Object invoke(MethodInvocation invocation) throws Throwable {   
        //Context封装了ThreadLocal,保存当前操作者Id,由Filter在请求进入的时候根据Session情况写入   
        Long userId = Context.getCurrentUserId();
        Method method = invocation.getMethod();

        Permission permission = method.getAnnotation(Permission.class); 

        if (permission != null) {
            if (userId == null) {
                //请求者还没有登录,允不允许他访问呢?
                   //code goes here, e.g: throw new LoginRequiredException();
              }
            String permissionStr = permission.value();
            //permissionManager负责验证是否有权限,如果没有权限,抛出ForbiddenException
            permissionManager.assertHasPermission(userId, permissionStr);
        }
        return invocation.proceed();
   }      
}



ForbiddenException和LoginRequiredException都是PermissionException的子类。
web层可以统一定制如果出现了PermissionException异常,则进行相关提示。

整个设计思路来源于Spring的 “事务管理器 + 事务拦截器” 模式,只是引入了Annotation而已。

了解到javaeye之前很多人对Annotation持保留态度,但各人有各人的具体情况和用法
怎么方便怎么用吧,天下太平。。。
5 楼 lighter 2007-05-12  
rainlife 写道
对annotation不感冒,可能是还没有感受到它的好处,现在项目中,仍还是XML,相信其它朋友也是以XML配置居多吧。

感觉要对annotation搞得好,很多时候ide也很重要的...
这一个问题论坛有一些帖子讨论了很多,挖一下坟就可以看到了..
4 楼 lighter 2007-05-12  
Qieqie 写道

1、实现一个PermissionInterceptor(extends MethodInvocation),当被拦截的方法注解了Permission,则调用权限中心判断当前调用者是否有该权限。
如何判断是否加注了Permission?-->Permission permission = method.getAnnotation(Permission.class); permission不为null便是。
如和知道当前调用者?-->参考ThreadLocal的使用
2、把PermissionInterceptor配置通过Spring或者其他支持AOP的容器中
3、配置哪些bean需要通过PermissionInterceptor拦截


举一下简单例子,你这里说的,类似这样的吗:
public class AuthorityInterceptor implements MethodInterceptor {   
  
    public Object invoke(MethodInvocation invocation) throws Throwable   
    {   
        HttpServletRequest request = null;   
        ActionMapping mapping = null;   
        Object[] args = invocation.getArguments();   
        for (int i = 0 ; i < args.length ; i++ )   
        {   
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];   
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];   
        }   
        if ( request.getSession().getAttribute("adminname") != null)   
        {   
            return invocation.proceed();   
        }   
        else   
        {   
            return mapping.findForward("login");   
        }   
    }   
}  

配置:
   <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
    <property name="beanNames">   
           <list>   
              <value>/vaiiduser</value>   
               <value>/admin</value>   
              <value>/phone</value>   
           </list>   
    </property>   
       <property name="interceptorNames">   
           <list>   
               <value>authorityInterceptor</value>    
           </list>   
       </property>   
   </bean>   
  
<bean id="authorityInterceptor" class="org.mmc.utils.AuthorityInterceptor"/>  
3 楼 xly_971223 2007-05-12  
引用
1、实现一个PermissionInterceptor(extends MethodInvocation),当被拦截的方法注解了Permission,则调用权限中心判断当前调用者是否有该权限。
如何判断是否加注了Permission?-->Permission permission = method.getAnnotation(Permission.class); permission不为null便是。
如和知道当前调用者?-->参考ThreadLocal的使用
2、把PermissionInterceptor配置通过Spring或者其他支持AOP的容器中
3、配置哪些bean需要通过PermissionInterceptor拦截

楼主的这个例子算是annotation的动态应用了吧,运行时判断有无权限 感觉还是比较方便
但是annotation做静态配置,感觉不是特别好。如 struts2的action配置
2 楼 rainlife 2007-05-12  
对annotation不感冒,可能是还没有感受到它的好处,现在项目中,仍还是XML,相信其它朋友也是以XML配置居多吧。
1 楼 dovecat 2007-05-11  
...总感觉annotation应该还可以更好的进行扩展和完善.

相关推荐

    Java并发编程实践 PDF 高清版

    在本书中,这些便利工具的创造者不仅解释了它们究竟如何工作、如何使用,同时,还阐释了创造它们的原因,及其背后的设计模式。 本书既能够成为读者的理论支持,又可以作为构建可靠的,可伸缩的,可维护的并发程序的...

    Java2程序设计150例(源代码).rar

    这份资源涵盖了Java2(也即J2SE,Java 2 Standard Edition)的核心概念和技术,通过实际的代码示例来阐释各种编程技巧和实践方法。以下是对其中关键知识点的详细解读: 1. **基础语法**:Java的基础语法包括变量...

    基于基因表达综合数据库芯片的类风湿关节炎生物标志物的筛选与生物信息学分析.pdf

    3. DAVID(Database for Annotation, Visualization and Integrated Discovery):一个在线生物信息学资源,提供基因列表的注释、功能分类和通路分析等。 4. KEGG(Kyoto Encyclopedia of Genes and Genomes):一个...

    Ontology理论研究和应用建模(国内高手总结).doc

    - 阐释(Annotation):提供额外的非逻辑信息,如元数据。 1.3 Ontology与语义网络 Ontology可以被视为语义网络的扩展,语义网络是一种简单的数据结构,用于表示实体(节点)及其相互关系(边)。Ontology在语义...

    FPGA电机控制方案解析:基于Verilog与Nios2的软硬协同设计

    内容概要:本文详细介绍了基于FPGA的电机控制系统设计方案,重点探讨了Verilog和Nios2软核的协同工作。系统通过将底层驱动(如编码器处理、坐标变换、SVPWM生成等)交给Verilog实现,确保实时性和高效性;同时,复杂的算法(如Park变换、故障保护等)则由Nios2处理。文中展示了多个具体实现细节,如四倍频计数、定点数处理、查表法加速、软硬件交互协议等。此外,还讨论了性能优化方法,如过调制处理、五段式PWM波形生成以及故障保护机制。 适合人群:具备一定FPGA和嵌入式系统基础知识的研发人员,尤其是从事电机控制领域的工程师。 使用场景及目标:适用于希望深入了解FPGA在电机控制中的应用,掌握软硬件协同设计方法,提高系统实时性和效率的技术人员。目标是通过学习本方案,能够独立设计并实现高效的电机控制系统。 其他说明:本文不仅提供了详细的代码片段和技术细节,还分享了许多实践经验,如调试技巧、常见错误及其解决办法等。这对于实际工程项目非常有帮助。

    模拟太阳系、轨道进动、时间延迟、光线偏折、黑洞阴影、星团以及航天器轨迹 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    计算机数控(CNC)装置.pdf

    计算机数控(CNC)装置.pdf

    西门子PLC与TiA博途实现冷热水恒压供水系统的变频器控制及多参数调控

    内容概要:本文详细介绍了使用西门子PLC和TiA博途软件构建冷热水恒压供水系统的具体方法和技术要点。主要内容涵盖变频器控制、模拟量输入输出处理、温度控制、流量计算控制及配方控制等方面。文中不仅提供了具体的编程实例,如LAD和SCL语言的应用,还分享了许多实用的经验和技巧,例如模拟量处理中的滤波方法、PID控制的优化策略、流量计算的高精度算法等。此外,针对实际应用中的常见问题,如信号干扰和参数整定,作者也给出了有效的解决方案。 适合人群:从事自动化控制系统开发的技术人员,尤其是对西门子PLC和TiA博途有一定了解并希望深入掌握冷热水恒压供水系统设计的专业人士。 使用场景及目标:适用于工业环境中需要精确控制水压、温度和流量的冷热水供应系统的设计与维护。主要目标是帮助工程师理解和实施基于西门子PLC和TiA博途的冷热水恒压供水系统,提高系统的稳定性和效率。 其他说明:文中提到的实际案例和编程代码片段对于初学者来说非常有价值,能够加速学习进程并提升实际操作能力。同时,关于硬件配置的选择建议也为项目规划提供了指导。

    基于PLC的自动蜂窝煤生产线五传送带控制系统设计与实现

    内容概要:本文详细介绍了基于PLC(可编程逻辑控制器)的自动蜂窝煤生产线中五条传送带的控制系统设计。主要内容涵盖IO分配、梯形图程序编写、接线图原理图绘制以及组态画面的设计。通过合理的IO分配,确保各个输入输出点正确连接;利用梯形图程序实现传送带的启动、停止及联动控制;接线图确保电气连接的安全性和可靠性;组态画面提供人机交互界面,便于操作员远程监控和操作。此外,还分享了一些实际调试中的经验和教训,如传感器安装位置、硬件接线注意事项等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程和工业自动化感兴趣的读者。 使用场景及目标:适用于需要设计和实施自动化生产线的企业和个人。目标是提高生产线的自动化程度,减少人工干预,提升生产效率和产品质量。 其他说明:文中提到的具体实例和代码片段有助于读者更好地理解和掌握相关技术和方法。同时,强调了硬件和软件相结合的重要性,提供了实用的调试技巧和经验总结。

    自动驾驶仿真中OpenScenario XML语法与场景构建详解

    内容概要:本文详细介绍了OpenScenario场景仿真的结构及其应用,特别是通过具体的XML代码片段解释了各个参数的作用和配置方法。文中提到的思维导图帮助理解复杂的参数关系,如Storyboard、Act、ManeuverGroup等层级结构,以及它们之间的相互作用。同时,文章提供了多个实用案例,如跟车急刹再加速、变道场景等,展示了如何利用这些参数创建逼真的驾驶场景。此外,还特别强调了一些常见的错误和解决方法,如条件触发器的误用、坐标系转换等问题。 适用人群:从事自动驾驶仿真研究的技术人员,尤其是对OpenScenario标准有一定了解并希望深入掌握其应用场景的人。 使用场景及目标:适用于需要精确控制交通参与者行为的自动驾驶仿真项目,旨在提高开发者对OpenScenario的理解和运用能力,减少开发过程中常见错误的发生。 其他说明:文章不仅提供了理论指导,还包括大量实践经验分享,如调试技巧、参数优化等,有助于快速解决问题并提升工作效率。

    基于Maxwell仿真的30kW自启动永磁同步电机6极72槽设计方案及性能优化

    内容概要:本文详细介绍了30kW、1000rpm、线电压380V的自启动永磁同步电机的6极72槽设计方案及其性能优化过程。首先,通过RMxprt进行快速建模,设定基本参数如电机类型、额定功率、速度、电压、极数和槽数等。接着,深入探讨了定子冲片材料选择、转子结构设计、绕组配置以及磁密波形分析等方面的技术细节。文中特别强调了双层绕组设计、短距跨距选择、磁密波形优化、反电势波形验证等关键技术手段的应用。此外,还讨论了启动转矩、效率曲线、温升控制等方面的优化措施。最终,通过一系列仿真和实测数据分析,展示了该设计方案在提高效率、降低谐波失真、优化启动性能等方面的显著成果。 适合人群:从事电机设计、电磁仿真、电力电子领域的工程师和技术人员。 使用场景及目标:适用于希望深入了解永磁同步电机设计原理及优化方法的专业人士,旨在为类似项目的开发提供参考和借鉴。 其他说明:文章不仅提供了详细的参数设置和代码示例,还分享了许多实践经验,如材料选择、仿真技巧、故障排除等,有助于读者更好地理解和应用相关技术。

    基于S7-1200 PLC和WinCC的燃油锅炉控制系统设计与实现

    内容概要:本文详细介绍了如何使用S7-1200 PLC和WinCC搭建一个完整的燃油锅炉自动控制系统。首先明确了系统的IO分配,包括数字量输入输出和模拟量输入输出的具体连接方式。接着深入讲解了梯形图编程的关键逻辑,如鼓风机和燃油泵的联锁控制、温度PID调节等。对于接线部分,强调了强电弱电线缆分离以及使用屏蔽线的重要性。WinCC组态方面,则着重于创建直观的操作界面和有效的报警管理。此外,还分享了一些调试技巧和常见问题的解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和SCADA系统有一定了解的人群。 使用场景及目标:适用于需要构建高效稳定的燃油锅炉控制系统的工业环境,旨在提高系统的可靠性和安全性,降低故障率并提升工作效率。 其他说明:文中提供了丰富的实践经验,包括具体的硬件选型、详细的程序代码片段以及实用的故障排查方法,有助于读者快速掌握相关技能并在实际工作中应用。

    电力电子领域中逆变器输出纹波电流预测与变开关频率PWM控制的Simulink仿真

    内容概要:本文详细探讨了逆变器输出纹波电流的来源及其对系统稳定性的影响,并提出了一种基于变开关频率PWM控制策略的解决方案。文中首先分析了纹波电流产生的原因,包括开关元件的导通关断、电感电流的非理想特性和电源电压波动。接着介绍了变开关频率PWM控制的基本原理,通过实时调整开关频率来优化纹波电流和开关损耗之间的平衡。随后,利用傅里叶变换建立了纹波电流预测模型,并通过Simulink仿真模型进行了验证。仿真结果显示,变开关频率控制能够显著减小纹波电流的幅值,提高系统的稳定性和效率。此外,文章还提供了具体的MATLAB/Simulink建模步骤以及一些优化建议,如提高开关频率上限、采用低纹波PWM算法和增加电感电流反馈。 适合人群:从事电力电子系统设计和优化的研究人员和技术人员,尤其是关注逆变器性能提升的专业人士。 使用场景及目标:适用于需要优化逆变器输出质量、提高系统稳定性和效率的应用场合。目标是通过变开关频率PWM控制策略,解决传统固定开关频率控制中存在的纹波电流大、效率低等问题。 其他说明:文章不仅提供了理论分析,还包括详细的仿真建模指导和优化建议,有助于读者更好地理解和应用相关技术。同时,文中提到的一些实用技巧和注意事项对于实际工程应用具有重要参考价值。

    数据结构领域中平衡树的原理及其应用解析

    内容概要:本文详细介绍了平衡树的基本概念、发展历程、不同类型(如AVL树、红黑树、2-3树)的特点和操作原理。文中解释了平衡树如何通过自平衡机制克服普通二叉搜索树在极端情况下的性能瓶颈,确保高效的数据存储和检索。此外,还探讨了平衡树在数据库索引和搜索引擎等实际应用中的重要作用,并对其优缺点进行了全面分析。 适合人群:计算机科学专业学生、软件工程师、算法爱好者等对数据结构有兴趣的人群。 使用场景及目标:帮助读者理解平衡树的工作原理,掌握不同类型平衡树的特点和操作方法,提高在实际项目中选择和应用适当数据结构的能力。 其他说明:本文不仅涵盖了理论知识,还包括具体的应用案例和技术细节,旨在为读者提供全面的学习资料。

    计算机三级网络技术 机试100题和答案.pdf

    计算机三级网络技术 机试100题和答案.pdf

    LabVIEW与YOLOv5结合:基于ONNX Runtime的多模型并行推理DLL封装及工业应用

    内容概要:本文详细介绍了将YOLOv5模型集成到LabVIEW环境中进行目标检测的方法。作者通过C++封装了一个基于ONNX Runtime的DLL,实现了YOLOv5模型的高效推理,并支持多模型并行处理。文中涵盖了从模型初始化、视频流处理、内存管理和模型热替换等多个方面的具体实现细节和技术要点。此外,还提供了性能测试数据以及实际应用场景的经验分享。 适合人群:熟悉LabVIEW编程,有一定C++基础,从事工业自动化或计算机视觉相关领域的工程师和技术人员。 使用场景及目标:适用于需要在LabVIEW环境下进行高效目标检测的应用场景,如工业质检、安防监控等。主要目标是提高目标检测的速度和准确性,降低开发难度,提升系统的灵活性和扩展性。 其他说明:文中提到的技术方案已在实际项目中得到验证,能够稳定运行于7x24小时的工作环境。GitHub上有完整的开源代码可供参考。

    逻辑回归ex2-logistic-regression-ex2data1

    逻辑回归ex2-logistic-regression-ex2data1

    MATLAB仿真单相高功率因数整流器:单周期控制与优化实践

    内容概要:本文详细介绍了使用MATLAB/Simulink搭建单相高功率因数整流器仿真的全过程。作者通过单周期控制(OCC)方法,使电感电流平均值跟随电压波形,从而提高功率因数。文中涵盖了控制算法的设计、主电路参数的选择、波形采集与分析以及常见问题的解决方案。特别是在控制算法方面,通过动态调整占空比,确保系统的稳定性,并通过实验验证了THD低于5%,功率因数达到0.98以上的优异性能。 适合人群:电力电子工程师、科研人员、高校师生等对高功率因数整流器仿真感兴趣的读者。 使用场景及目标:适用于研究和开发高效电源转换设备的技术人员,旨在通过仿真手段优化整流器性能,降低谐波失真,提高功率因数。 其他说明:文章提供了详细的代码片段和调试经验,帮助读者更好地理解和应用单周期控制技术。同时提醒读者注意仿真与实际硬件之间的差异,强调理论计算与实际调试相结合的重要性。

    计算机设备采购合同.pdf

    计算机设备采购合同.pdf

    计算机三级网络技术考试资料大全.pdf

    计算机三级网络技术考试资料大全.pdf

Global site tag (gtag.js) - Google Analytics