注解(Annottation)又叫标注,是从java5开始增加的一种引用数据类型。 Java 8以前,注解只能在声明的地方使用(声明方法、变量、类等),Java 8开始,注解可以在任何地方使用(泛型、抛异常、方法中等),这是因为Java 8 增加了两种ElementType。注解本质上就是代码中的特殊标记,通过这些标记可以编译、类加载、以及运行时执行的处理。
语法为
访问修饰符 @interface 注解名称{
访问修饰符 属性类型 属性名称1(); // 注解成员;
访问修饰符 属性类型 属性名称2() default 默认值; // 注解成员;
}
注解使用的常见场景
-
生成文档
-
代理配置文件
-
权限管理
-
日志改造
注解的用途:这个问题要配合元注解说明。元注解:用来标注注解的注解,用来配置这个注解的基本属性:
-
@Target(ElementType...)此注解的标注范围,用在哪里(类,接口,枚举,注解类,方法,参数),
-
@Retention(RetentionPolicy...)此注解什么时候有效。
-
@Documented标示将注解的元素包含到javadoc中。
-
@Inherited标示改注解可以被继承,如果一个父类使用该注解,子类没有做其他注解时,默认继承了父类的注解。
-
@Repeatable标示该注解在一个地方可重复使用,可以取不同的值,
-
@Target:限定注解的作用范围,比如方法、类、变量、等,具体如下:
-
ANNOTATION_TYPE,//可以用在另一个注解上(自定义元注解)
-
CONSTRUCTOR,//可以用于构造方法上
-
FIELD,//可以用于字段声明上,包括枚举上
-
LOCAL_VARIABLE,//可以用于局部变量上
-
METHOD,//可以用于方法上
-
PACKAGE,//可以用于包声明上
-
PARAMETER,//可以用于参数声明上
-
TYPE,//可以用于类、接口、枚举声明上
-
TYPE_PARAMETER,//表示注解能写在类型变量的声明语句中。1.8版本加入的
-
TYPE_USE;//表示注解能写在使用类型的任何语句中 1.8版本加入
元注解有效期配置
-
@Retention(RetentionPolicy.SOURCE):注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里。使用场景:用来让读源码的人看的。
-
@Retention(RetentionPolicy.CLASS):注解在class文件中可用,但会被VM丢弃(该类型的注解信息会保留在源码里和class文件里,在执行的时候,不会加载到虚拟机中),请注意,当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override,@Deprecated,@SuppressWarnning等。使用场景:编译器使用的
-
@Retention(RetentionPolicy.RUNTIME):注解信息将在运行期(JVM)也保留,因此可以通过反射机制读取注解的信息(源码、class文件和执行的时候都有注解的信息),如SpringMvc中的@Controller、@Autowired、@RequestMapping等。使用场景:通过java反射机制获取到此注解中的参数内容,或此注解标注过的对象,用于做不同的业务处理。
因此,自定义注解通常使用在RUNTIME级别。
常用注解说明
JDK的内置注解
-
@override :检测被注解标注的方法是否继承自父接口
-
@Deprecated: 该注解标注的内容已过时
-
@suppressWarings :压制警告
JPA的注解
@Entity
-
@Table
-
@Id
-
@GeneratedValue
-
@Column
Spring的注解
声明bean的注解
-
@Component 组件,没有明确的角色
-
@Service 在业务逻辑层使用(service层)
-
@Repository 在数据访问层使用(dao层)
-
@Controller 在展现层使用,控制器的声明(C)
注入bean的注解
-
@Autowired:由Spring提供
java配置类相关注解
-
@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上)
-
@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上)
-
@Configuration 声明当前类为配置类,其中内部组合了@Component注解,表明这个类是一个bean(类上)
-
@ComponentScan 用于对Component进行扫描,相当于xml中的(类上)
切面(AOP)相关注解
Spring支持AspectJ的注解式切面编程。
-
@Aspect 声明一个切面(类上)
-
使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
-
@After 在方法执行之后执行(方法上)
-
@Before 在方法执行之前执行(方法上)
-
@Around 在方法执行之前与之后执行(方法上)
-
@PointCut 声明切点
利用工厂模式、代理模式和注解模拟实现spring的IOC、AOP及利用AOP实现记录日志。
IOC
分析:依赖注入是需要在提供Bean之前,将声明的依赖添加到Bean中,因此不能new对象,需要利用工厂模式提供产品。为了保护实际的执行着,采用代理模式,提供产品。声明对象之间的关系可以使用xml等配置文件,也可以使用注解的方式实现,对于注解方式更便捷。
设计:
声明两个注解:
@Component:用于告知哪些Bean使用框架管理。
@Resource:指定需要注入的类型。
提供两个工厂:
BeanFactory:
初始化需要管理的Bean。
提供Bean的产品
ProxyFactory:利用cglib在执行方式前,将需要依赖注入到要执行任务的Bean中。
AOP
分析:在不改变已有程序的前提,指定一个切面。
指定切点,并提供切点执行的顺序。例如在执行前或执行后通知。
设计:
声明注解:
@Aspect:切面
@Before:前通知切点
@After:后通知切点
提供一个工厂
IntercepterFactory:初始化切面及切点。
提供两个管理对象
IntercepterDefine:需要拦截的切面信息。
IntercepterExcuteDefine:在拦截后实际执行的信息。
网友评论