什么是Annotation,怎么自定义Annotation,Annotation和XML的优缺点各是什么?

分享人:鲁伯良

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍


什么是注解?

注解(Annotation),也叫元数据.一种代码级别的说明.它是jdk1.5及以后版本引入的一个特性
与类,接口,枚举是在同一个层次.它可以声明在包、类、字段、方法、局部变量、方法参数等
的前面,用来对元素说明注释。注解是以“@注解名”在代码中存在的。
注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记, 没有加,则等于没有任何标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的 类及各种元素上有无何种标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法 的参数以及局部变量上

2.知识剖析

四大元注解 @Retention、@Inherited、@Documented、@Target


元注解就是注解的注解,当我们要自定义注解时用
1.@Retention: 定义注解的保留策略 @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

2.@Target用来声明注解范围(枚举ElementType),ElementType可选值:
源码为: @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}

@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
}
3.@Inherited 声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解
4.@声明注解能够被javadoc等识别

自定义注解

定义自定义注解使用@interface 关键字
public @interface 注解名 {定义体}
一旦在自定义注解里面定义了成员变量之后,在使用该注解是就应该为该注解的成员变量指定值
如果只有一个参数成员,最好把参数名称设为"value",后加小括号。
也可以在自定义注解的成员变量的时候为其制定初始值,.(默认值)

3.常见问题

注解的使用场景

4.解决方案

1.类属性自动赋值。
2验证对象属性完整性。
3代替配置文件功能,像spring基于注解的配置。
4可以生成文档,像java代码注释中的@see,@param等

5.编码实战

6.扩展思考

spring注解

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率
为了解决这两个问题,Spring引入了注解,通过”@XXX”的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。


如何使用


再上下文文件中加入如下代码和相应的jar包 扫描 context:component-scan base-package="包"
多个包逗号隔开。


常用注解


1、@Component
通用一般不推荐使用
2、@Controller
@Controller对应表现层的Bean
3、@ Service
@Service对应的是业务层Bean
4、@ Repository
@Repository对应数据访问层Bean



@Controller, @Service, @Component, @Repository 刨析
其中@Component是一种通用名称,泛指任意可以通过Spring来管理的组件,@Controller, @Service, @Repository则是一种特定的组件,通常用来表示某种特定场合下的组件,比如@Repository用来表示仓库(数据层,DAO),并且Spring 框架会根据这种应用场景做些定制,比如@Repository同时具备了自动化的异常转换。类似的, @Service则用来表示服务层相关的类, @Controller则用来表示展示层(presentation)的类。



为什么要分层 所有这些分层方式都是为了解决应用从小项目成长为大项目时可能遇到的隐患,代价是在项目还小时,增加了项目的复杂度,往往一句代码就能搞定的事情,却要拆到三个类中去。但是太多的实际例子表明,如果没有好的架构,当小项目膨胀到一定程度时,往往是无法维护的,只能全部推倒重写。

7.参考文献

参考:

互联网

8.更多讨论

感谢大家观看

BY : 鲁伯良