1、元注解
可以在其他注解上声明的注解;如果一个注解可以在其他注解上声明,它就是元注解
@Documented
- 如果添加了元注解@Documented,该注解可以在javadoc中体现
@Retention
- 用于描述注解的声明周期,表示在什么级别上保留注释信息;即被描述的注解在什么范围内有效
类型 | 说明 |
---|---|
RetentionPolicy.SOURCE | 在源文件中有效,即源文件保留 |
RetentionPolicy.CLASS | 在 class 文件中有效,即class文件保留 |
RetentionPolicy.RUNTIME | 在运行时有效,即运行时保留 |
@Inherited
- 是否运行子类继承该注解,如果一个被@Inherited注解修饰的annotation类型作用于某个class,该类的子类也使用该annotation注解
- 使用@Inherited annotation类型是被标注过的class的子类所继承,类并不从它所实现的接口继承annotation,方法并不从其所重载的方法继承annotation
@Target
- 用于描述注释的使用范围
类型 | 说明 |
---|---|
CONSTRUCTOR | 用于描述构造器 |
FIELD | 用于描述域或属性 |
LOCAL_VARIABLE | 用于描述局部变量 |
METHOD | 用于描述方法 |
PACKAGE | 用于描述包 |
PARAMETER | 用于描述参数 |
TYPE | 用于描述类、接口(包括注解类型) 或enum声明 |
这四个元注解都是可选的
注解参数
- 参数成员只能用public或默认两种访问权限
- 可以为参数设置默认值
- 如果注解只有一个参数,使用时可以直接去掉参数名赋值
- 参数成员只能用8种基本数据类型和String 、Enum、Class、annotation等数据类型,以及这些类型的数组形式
- 如果注解有多个参数,必须指定名称赋值,并以‘,’进行分割
2、模式注解
- 只要在相应类上声明这些注解,就可以定义为spring bean;spring核心部分提供了几种内建模式注解;
- 任何被@Component标注的组件均为组件扫描的候选对象;任何使用@Component标注的注解,当其标注组件时,同样可以被当做被扫描的候选对象
- @Component is a generic stereotype for any Spring-managed component. Any component annotated with @Component is a candidate for component scanning. Similarly, any component annotated with an annotation that is itself meta-annotated with @Component is also a candidate for component scanning. For example, @Service is meta-annotated with @Component.
- Spring 模式注解可理解为@Component“派生”注解
3、组合注解
- 某个注解"元标注"一个或多个其他注解,目的在于将这些关联的注解行为组合成单个自定义注解
- 举例@TransactionalService注解标注了@Transactional和@Service注解,前者是Spring事务注解,后者是Spring模式注解;@TransactionalService组合了这两个注解的语义,同时TransactionalService也是一个自定义的模式注解;
- 言外之意是,Spring组合注解的元注解允许是Spring模式注解与其他Spring功能性注解的任意组合
4、spring注解属性别名和覆盖
- 在Java反射编程模型中,注解之间无法继承,也不能实现接口,不过Java语言默认将所有注解实现Annotation接口,被标注的对象用API AnnotatedElement表达,通过AnnotatedElement#getAnnotation(Class)方法返回指定类型的注解对象,获取注解属性则需要显示地调用对应的属性方法
属性别名
在spring中使用@AliasFor 注解可以做到别名的功能,spring中别名可分为以下几类:
- 显式别名(xplicit Aliases)
同一个注解内的两个成员通过注解@AliasFor声明后互为别名,这就是显式别名
- 隐式别名(Implicit Aliases)
同一个注解中的两个或多个成员通过注解@AliasFor去覆盖同一个注解的成员,它们彼此互为隐式别名
- 传递隐式别名(Transitive Implicit Aliases)
同一个注解中的两个或多个成员通过注解@AliasFor去覆盖注解中的不同成员,但实际上因覆盖的传递性导致最终覆盖的是元注解中的同一个成员,这就是传递隐式别名
均需要满足的条件:
- 属性类型相同
- 属性方法必须存在默认值
- 属性默认值必须相同
属性覆盖
属性覆盖是指同一个注解的成员覆盖另一个成员,最终两个成员属性一致
- 隐式覆盖
当一个注解@One被元注解@Two标注,两个注解存在相同的属性方法method. @Two@method将会被@One#method属性覆盖
- 显式覆盖
使用@AliasFor注解便可实现显式覆盖- 传递式显式覆盖
如果注解@One@name显式覆盖了@Two@nameAlias,而@TwonameAlias显式覆盖了@Three#nameAlias,因为传递性,@One#name实际上覆盖了@Three#nameAlias
5、spring 常见核心注解及使用场景
- 元注解
Spring注解 | 说明 |
---|---|
@Documented | 注解将能够在JavaDoc中展现 |
@Retention | 描述注解的生命周期 |
@Inherited | 是否允许子类继承该注解 |
@Target | 表示该注解用于什么地方。默认值为任何元素 |
- spring 模式注解
Spring注解 | 说明 |
---|---|
@Component | 通用组件模式注解 |
@Repository | 数据仓库模式注解 ,表示数据库增删查改操作 |
@Service | 服务模式注解,处理内部服务各种逻辑 |
@Controller | Web控制器模式注解,处理各种Http交互 |
@Configuration | 配置类模式注解 |
- 装配注解
Spring注解 | 说明 |
---|---|
@ImportResource | 替换XML元素 |
@Import | 限定@Autowired依赖注入范围 |
@ComponentScan | 扫描指定package下标注Spring模式注解的类 |
-
依赖注入注解
Spring注解 说明 @Autowired Bean依赖注入,支持多种依赖查找方式 @Qualifier 细粒度的@Autowired依赖查找 Java注解 说明 @Resource Bean依赖注入,仅支持名称依赖查找方式 -
Bean定义注解
Spring注解 说明 @Bean 替换XML元素"<Bean>" @DependsOn 替换XML元素<bean depends-on="."/> @Lazy 替换XML元素<bean lazy-init=“true | falses”/> @Primary 替换XML元素<bean primary=“true | falses”/> @Role 替换XML元素<bean role="."/> @Lookup 替换XML元素<bean lookup-method="."/> -
spring条件装配注解
Spring注解 说明 @Profile 配置换条件注解 @Conditional 编程条件注解 -
配置属性注解
Spring注解 说明 @PropertySource 配置属性抽象PropertySource注解 @PropertySources PropertySource集合注解 -
生命周期回调注解
Spring注解 说明 @PostConstruct 替换XML元素<bean init-method="."/>或InitializingBean @PreDestroy 替换XML元素<bean destroy-method="."/>或DisposableBean -
注解属性注解
Spring注解 说明 @AliasFor 别名注解属性,实现复用的目的 -
性能注解
Spring注解 说明 @Indexed 提升Spring模式注解的扫描效率