zoukankan      html  css  js  c++  java
  • Spring注解原理

    一、注解的基本概念和原理及其简单实用

    注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化得方法,使我们可以在稍后某个时刻方便的使用这些数据(通过解析注解来使用这些数据),用来将任何的信息或者元数据与程序元素(类、方法、

    成员变量等)进行关联。其实就是更加直观更加明了的说明,这些说明信息与程序业务逻辑没有关系,并且是供指定的工具或框架使用的。Annotation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的申明语句

    中。

    Annotation其实是一种接口。通过Java的反射机制相关的API来访问Annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。Java语言解释器在工作时会忽略这些Annotation,因此在JVM中这些

    Annotation是“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。

    Annotation和interface的异同:

    • Annotation的类型使用关键字@interface而不是interface。它继承了java.lang.annotition.Annotition接口并非申明了一个interface。
    • Annotation类型、方法定义是独特的、受限制的。Annotation类型的方法必须申明为无参数、无异常抛出的。这些方法定义了Annotation的成员:方法名称为了成员名,而方法返回值称为了成员的类型。而方法返回值必须为primitive类型、Class类型、枚举类型、Annotation类型或者由前面类型之一作为元素的一位数组。方法的后面可以使用default和一个默认数值来申明成员的默认值,null不能作为成员的默认值,这与我们在非Annotation类型中定义方法有很大不同。Annotation类型和他的方法不能使用Annotation类型的参数,成员不能是generic。只有返回值类型是Class的方法可以在Annotation类型中使用Generic,因为此方法能够用类转换将各种类型转换为Class。
    • Annotation类型又与接口有着近似之处。它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。
    * 元注解@Target,@Retention,@Documented,@Inherited 
    * 
    * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: 
    * ElemenetType.CONSTRUCTOR 构造器声明 
    * ElemenetType.FIELD 域声明(包括 enum 实例) 
    * ElemenetType.LOCAL_VARIABLE 局部变量声明 
    * ElemenetType.METHOD 方法声明 
    * ElemenetType.PACKAGE 包声明 
    * ElemenetType.PARAMETER 参数声明 
    * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 
    * 
    * @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: 
    * RetentionPolicy.SOURCE 注解将被编译器丢弃 
    * RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 
    * RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 
    * 
    * @Documented 将此注解包含在 javadoc 中 
    * 
    * @Inherited 允许子类继承父类中的注解
    
    @Target(ElementType.METHOD) 
    @Retention(RetentionPolicy.RUNTIME) 
    @Documented 
    @Inherited

    下面的示例来简单的讲Spring注解原理

    1、定义注解

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Test {
        boolean ignore() default false;
    }

    2、带有注解类

    import java.lang.reflect.Method;
    import com.google.common.base.Throwables;
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class CalculatorTest {
    
        @Test
        public void testAdd() {
            System.out.println("test add method.");
        }
    
        @Test(ignore = true)
        public void testSubtract() {
            System.out.println("test subtract method.");
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            CalculatorTest obj = new CalculatorTest();
            run(obj);
        }
    
        private static void run(CalculatorTest obj) {
            try {
                for (Method method : obj.getClass().getMethods()) {
                    Test test = method.getDeclaredAnnotation(Test.class);
                    if (test != null && !test.ignore()) {
                        method.invoke(obj);
                    }
                }
            } catch (Exception ex) {
                log.error("{}", Throwables.getStackTraceAsString(ex));
            }
    
        }
    }
  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/kaleidoscope/p/9766246.html
Copyright © 2011-2022 走看看