随着spring注解的引入,越来越多的开发者开始使用注解,这篇文章将对注解的机制进行串联式的讲解,不求深入透彻,但求串起spring beans注解的珍珠,展示给大家。
spring beans常用的注解:
- 自动装配
@Autowired
:可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。
- 配置属性
@Configurable
注解中的autowire属性就可以让Spring来自动装配了:
随着spring注解的引入,越来越多的开发者开始使用注解,这篇文章将对注解的机制进行串联式的讲解,不求深入透彻,但求串起spring beans注解的珍珠,展示给大家。
@Autowired
:可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。
@Configurable
注解中的autowire属性就可以让Spring来自动装配了:
如果类,字段,方法和方法参数注解(例如@Deprecated或@Override)存储在已编译的类中,则它们的保留策略不是RetentionPolicy.SOURCE。
该信息在运行时不会由字节码指令使用,但是如果保留策略为RetentionPolicy.RUNTIME,则可以通过反射API进行访问。
编译器也可以使用它。
结构体
源代码中的注解可以采用多种形式,例如@ Deprecated,@ Retention(RetentionPolicy.CLASS)或@Task(desc =“ refactor”,id = 1)。
使用 javac -g
编译的类包含其源文件的名称,源行号和字节码指令之间的映射以及源代码中的本地变量名称和字节码中的本地变量槽之间的映射。
此可选信息在调试器中以及可用时在异常堆栈跟踪中使用。
类的源文件名存储在专用的类文件结构部分中(请参见图2.1)。
源行号和字节码指令之间的映射存储为方法的已编译代码部分中(行号,标签)对的列表。
例如,如果l1,l2和l3是按此顺序出现的三个标签,则以下对:
(n1, l1)
(n2, l2)
(n3, l3)
过去已经以类文件格式引入了新元素,并且将来将继续添加新元素(例如,用于模块化,Java类型的注释等)。
直到ASM 3.x,每个此类更改都导致ASM API中向后不兼容的更改,这是不好的。
为了解决这些问题,ASM 4.0中引入了一种新的机制。
其目标是确保即使将来在类文件格式中引入了新功能时,所有将来的ASM版本都将保持与任何先前版本(直至ASM 4.0)的向后兼容性。
这意味着从4.0开始,为一个ASM版本编写的类生成器,类分析器或类适配器仍可用于将来的任何ASM版本。
但是,仅由ASM不能确保此属性。
本节介绍了使用核心ASM API时必须遵循的准则,以确保您的代码在将来的任何ASM版本中均保持有效(按照上述合同的意义)。
首先,如果您编写类生成器,则没有任何可遵循的准则。
例如,如果您为ASM 4.0编写了一个类生成器,则它可能会包含一个诸如 visitSource(mySource, myDebug)
之类的调用,当然也不会包含对visitLicense的调用。
如果使用ASM 5.0不变地运行它,它将调用不推荐使用的visitSource方法,但是ASM 5.0 ClassWriter会在内部将其重定向到visitSource(null,mySource,myDebug),从而产生
预期的结果(但效率要比升级代码以直接调用新方法低)。
reflectasm is a very small Java library that provides high performance reflection by using code generation.
An access class is generated to set/get fields, call methods, or create a new instance.
注解,元数据的一种形式,提供了程序本身之外的数据。注释对注释的代码的操作没有直接影响。
注解有许多用途,其中包括:
编译器的信息—编译器可以使用注释来检测错误或抑制警告。
编译时和部署时处理——软件工具可以处理注释信息来生成代码、XML文件等等。
运行时处理——可以在运行时检查一些注释。
这节课,还可以使用注释解释道,如何应用注释,在Java平台中可用的预定义的注释类型,标准版(Java SE API),如何使用类型annnotations结合可插入类型系统与强类型检查编写代码,以及如何实现重复注释。
Annotation(注解)是JDK5.0及以后版本引入的。它的作用是修饰程序元素。
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记。
程序可以利用java的反射机制来了解你的类及各种元素上有无何种标记,针对不同的标记,就去做相应的事件。
后续会对这些进行讲解,本文主要讲解 Java 内置注解。
@Override
指示一个方法声明要覆盖一个超类型中的方法声明。
适用于其他注释的注释称为元注释。在 java.lang.annotation 中定义了几个元注释类型。
@Retention
指定标记的注解如何存储:
属性 | 说明 |
---|---|
RetentionPolicy.SOURCE | 标记的注释只保留在源层中,编译器将忽略它。 |
RetentionPolicy.CLASS | 编译器在编译时保留标记的注释,但是Java虚拟机(JVM)会忽略它。 |
RetentionPolicy.RUNTIME | 标记的注释由JVM保留,以便运行时环境可以使用它。 |
通过注解,有时候可以使我们的代码编写变得十分强大。
本文仅通过最简单的例子,展示如何定义使用以及解析注解。
定义一个标签注解。可以在类、方法、字段上使用。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.LOCAL_VARIABLE})
public @interface Tag {
/**
* tag 标签
*
* @return tag
*/
String value();
}