`

Annotation一点总结

阅读更多

原写于2011-06-25

 

题记:建议关于spring问题,请记得查看spring reference

 

一、annotation前生后世

Annotations do not directly affect program semantics, but they do affect the way programs are treated by tools and libraries, which can in turn affect the semantics of the running program. Annotations can be read from source files, class files, or reflectively at run time.

译:annotation不会直接影响程序的语义,xxxAnnotation可以从源文件、class文件、通过反射在运行时读取。

 

参考:http://www.developer.com/print.php/3556176

1.定义

Annotation type declarations are similar to normal interface declarations. An at-sign (@) precedes the interface keyword. Each method declaration defines an element of the annotation type. Method declarations must not have any parameters or a throws clause. Return types are restricted to primitives, StringClassenums, annotations, and arrays of the preceding types. Methods can have default values.

Annotation声明与普通的interface非常相似,在关键字interface前加@。每一个方法的声明定义一个annotation的元素。方法不能有任何的参数或throws异常。返回类型被限制为:原始类型、StringClassenumannotation、前面描述的类型组成的数组。method定义允许有默认值。

 

2.Java annotation

There are two types of annotations available with JDK5:

Simple annotations: These are the basic types supplied with Tiger, which you can use to annotate your code only; you cannot use those to create a custom annotation type.

三个基本的annotation,如:OverrideDeprecatedSuppresswarnings,不能使用它去定义新的annotation

Meta annotations: These are the annotation types designed for annotating annotation-type declarations. Simply speaking, these are called the annotations-of-annotations.

annotation,定义annotation的类型。如:TargetRetentionDocumentedInherited

- Target:声明annotation注解的目标类型。如@Target(ElementType.TYPE)@Target(ElementType.METHOD)

- Retention:声明annotation被保留的长度。如:RetentionPolicy.SOURCERetentionPolicy.CLASSRetentionPolicy.RUNTIME

- Documented:声明被注解的target生成doc是否需要显示annotation信息。

- Inheritedxxx

 

3.annotation作用

不影响程序原本语义的情况下,增加信息+工具=声明式编程。如:spring aop

 

 

二、利用annotation实现aop

1. 思路

A.自定义注解定义规则(何时执行)

B.标记行为(执行什么)

C.通过反射生成代理,在对象执行任何方法时,进行拦截判断是否符合规则;若符合,执行对应的行为。

2. 例子

场景:一个表演家,表演节目后,观众拍手鼓掌

原始:表演家拥有所有观众的引用,在自己表演完后,通知观众鼓掌

问题:表演家应该关注表演自身的事情,有哪些观众、观众是否鼓掌,不是其所关注的

改进:AOP方式,表演家仅关注表演,观众鼓掌由其它人负责

总结:

面向切面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。 面向对象将应用程序分解成各个层次的对象,而AOP将程序分解成各个切面或者说关注点。这使得可以模块化诸如事务管理等这些横切多个对象的关注点。

 

 

三、spring aop如何使用annotation

1. 基本方式,通过ProxyFactoryBean

a.通知

b.切入点

b.通知+切入点 à切面

c.实际对象+接口+切面 à接口代理

2. 自动代理方式:

基本方式的问题是,xml配置文件繁琐。

a.基于spring上下文的通知者Bean的自动代理(利用PostBeanProcessor

BeanNameAutoProxyCreator,有属性:beanNames(被代理对象)、interceptorNames(通知)。自动代理beanNames指定的bean,此时interceptorNames指定通知,但interceptor需要实现特定的接口,如:MethodBeforeAdvice

b.基于aspectJ注解驱动

使用aspectJ风格的注解。原理:生成代理,仅方法级别。使用AspectJ 提供的一个库来做切点(pointcut)解析和匹配。

c.<aop:config>,优点:任何类都能转化为切面,不需要特殊接口或注解,原始pojo对象

aop参数传递,见:spring reference  6.3.3.6 通知参数

around切点,必须传递ProceedingJoinPoint参数,通过ProceedingJoinPoint取得方法的所有信息。

其它切点,利用JoinPoint取得方法的所有参数。(通过参数名绑定传递参数,未理解)

 

四、annotation相关技术

1.cglib

它的原理就是用Enhancer生成一个原有类的子类,并且设置好callbackproxy 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxyintercept() 函数。

2.asm

ASM is an all purpose Java bytecode manipulation and analysis framework. It can be used to modify existing classes or dynamically generate classes, directly in binary form. Provided common transformations and analysis algorithms allow to easily assemble custom complex transformations and code analysis tools.

ASM offer similar functionality as other bytecode frameworks, but it is focused on simplicity of use and performance. 

简单理解asm是比cglib更高级的code generate lib

 

五、others问题

1.Generics 

Generics - This long-awaited enhancement to the type system allows a type or method to operate on objects of various types while providing compile-time type safety. It adds compile-time type safety to the Collections Framework and eliminates the drudgery of casting. See theGenerics Tutorial. (JSR 14)

泛型提供了编译时类型检查安全。这点很重要吗

 

2.为什么spring aop aspectJ anonotationpointcut声明,必须注解在方法上 ?通过方法唯一标识一个pointcut

猜测:@PointcutTarget属性指定仅为method。方法签名成为pointcutid

 

 

分享到:
评论

相关推荐

    spring中自定义注解(annotation)与AOP中获取注解

    总结来说,Spring中的自定义注解和AOP的结合,提供了一种强大的工具,帮助开发者实现更高级别的抽象和解耦。自定义注解用于标记特定的行为或状态,而AOP则负责在运行时动态地响应这些标记,以执行相应的逻辑。这种...

    ios百度地图自定义calloutView

    总结来说,实现`ios百度地图自定义calloutView`需要以下几个步骤: 1. 导入百度地图SDK并注册API密钥。 2. 创建自定义的calloutView类。 3. 实现`MKAnnotation`协议和自定义Annotation类。 4. 设置地图视图的代理,...

    Android-一个基于运行时注解与编译时注解的AndroidIocDemo

    总结来说,这个"Android-一个基于运行时注解与编译时注解的Android Ioc Demo"是一个很好的学习资源,它涵盖了Android开发中的关键概念——依赖注入,以及如何利用Java的注解系统来实现这一模式。通过研究和实践,...

    Spring boot将配置属性注入到bean类中

    总结一下,Spring Boot通过`@ConfigurationProperties`注解实现了配置文件属性与Java Bean的映射,简化了属性注入的过程。而`@EnableConfigurationProperties`则提供了开启和自定义配置绑定的能力。这两个注解的使用...

    spring boot aop 统一处理日志

    在Spring中,我们通过定义切点(Pointcut)和通知(Advice)来实现这一点。切点定义了程序执行过程中关注的方法或类,而通知则是在这些切点触发时执行的代码。 在Spring Boot中,我们可以使用注解驱动的AOP,这使得...

    RuntimeInvisibleAnnotationsAttribute.rar_Invisible!

    通常,这样的类可能会继承自`java.lang.annotation.Annotation`接口,并且不包含任何公共方法,因为运行时不可见注解不允许在运行时被查询。 总结来说,这个压缩包文件包含的信息主要涉及Java的元数据特性,特别是...

    使用一般参数传递方式,实现简单计算器的加减乘除后端接口功能。

    为了实现这一点,我们通常会使用一种服务器端编程语言,如Java(使用Spring Boot)、Python(使用Flask或Django)、Node.js(使用Express)等。以下是一个简单的Java Spring Boot实现示例: ```java import org....

    Arcmap技巧总结

    ArcMap提供了多种方法来实现这一点,包括使用`Carve to Annotation`、`Draw`工具条或是从其他地方转换注记图层。 #### 十四、查看特定区域范围内的某种地物分布情况 要查看特定区域内某种地物的分布情况,可以使用...

    LoonAndroid超低耦合注解框架.zip

    在Java中,注解是一种元数据,可以提供有关程序元素的附加信息,而LoonAndroid正是利用这一点,使得组件之间的耦合度降低,增强了代码的灵活性。 二、核心原理 1. 注解处理:LoonAndroid框架通过自定义的注解...

    使用Spring Boot和Python Flask实现AI文本分类服务注册与发现

    可以通过查询etcd中的服务列表来实现这一点。下面是一个简单的示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; ...

    junit4.7.zip

    首先,JUnit 4.7引入了注解(Annotation)的广泛使用,这是对传统基于XML配置的一大改进。通过注解,我们可以直接在测试类和方法上声明测试元数据,例如`@Test`用于标记测试方法,`@Before`和`@After`分别表示在每个...

    springmvc静态资源访问

    ### Spring MVC 中静态资源访问详解 #### 一、引言 ...通过使用Spring MVC提供的工具和技巧,开发者可以轻松实现这一点。希望本文能够帮助读者更好地理解和掌握Spring MVC中静态资源的处理方式。

    Spring AOP面向方面编程原理:AOP概念

    这一点极大地降低了代码的耦合度。 2. **轻量级**:与一些需要预编译器的AOP框架不同,Spring AOP无需特殊的工具或编译步骤即可使用。这种轻量级的特性使得Spring AOP更易于学习和集成。 3. **灵活的通知模型**:...

    ModelAttribute注解详细使用.docx

    这一点非常重要,因为它可能会影响到多个请求的数据处理逻辑。因此,在实际应用中,我们需要根据业务需求来决定是否以及如何使用`@ModelAttribute`。 #### 三、`@ModelAttribute`的常见使用场景 接下来,我们通过...

    ajax框架:dwr》实战(包括整合)

    - **使用 ANNOTATION 代替 DWR.XML 配置**:介绍如何使用注解来替代 XML 配置文件,以简化配置过程。 #### 四、DWR+SPRING+HIBERNATE 整合实战 **1. DWR+SPRING+HIBERNATE 结构说明** - **DWR**:处理前端 AJAX ...

    Spring自定义切面事务问题

    - 对于一般的业务逻辑来说,将事务管理器的`order`值设置得稍微高一点(例如200),而自定义切面的`order`值设置得较低(例如1),通常是一个比较合理的实践。 - 在进行切面编程时,建议仔细考虑每个切面的功能...

    matlab画图时图例的设置方法

    set(get(get(H(i), 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off'); end legend('1', '6', '11', '16', '21'); ``` 这段代码会隐藏除第1、6、11、16、21条曲线之外的所有图例。 **方法2**: ``...

    Spring3.0+Struts2.1+ Hibernate3.5融合步骤

    &lt;tx:annotation-driven transaction-manager="transactionManager"/&gt; &lt;!-- 定义其他业务逻辑 Bean --&gt; ``` #### 4. 整合 Struts2 和 Spring 为了让 Struts2 能够利用 Spring 的依赖注入特性,需要进行一些...

    arcgis工具

    arcgis工具总结 1. 要素的剪切与延伸 实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关。 2. 自动捕捉跟踪工具 点击Editor工具栏中Snapping来打开Snapping Environment对话框 捕捉设置...

Global site tag (gtag.js) - Google Analytics