注解

本质

注解的本质就是一个继承了 Annotation 接口的接口特殊的注释

解析注解两种形式:编译期扫描、运行期反射。

元注解

  • @Target:注解的作用目标
    • TYPE:允许被修饰的注解作用在类、接口和枚举上
    • FIELD:允许作用在属性字段上
    • METHOD:允许作用在方法上
    • PARAMETER:允许作用在方法参数上
    • CONSTRUCTOR:允许作用在构造器上
  • @Retention:注解的生命周期
  • @Documented:注解是否应当被包含在 JavaDoc 文档中
  • @Inherited:是否允许子类继承该注解

内置注解

  • @Override
  • @Deprecated
  • @SuppressWarnings

注解与反射

当通过反射( getAnnotation 方法)去获取一个注解类实例的时候, JDK 是通过动态代理机制生成一个实现注解(接口)的代理类:public final class $Proxy1 implements Hello{},代理类实现接口 Hello 并重写其所有方法,包括 value 方法以及接口 Hello 从 Annotation 接口继承而来的方法。。

AnnotationInvocationHandler 是 JAVA 中专门用于处理注解的 Handler。invoke 函数将注解的属性值key-value保存在map中。这样就可以在程序运行时(注解设置为运行时可见)通过反射获取到注解的配置信息。

Spring 注解

组件类注解

  • @Component :标准一个普通的spring Bean类。可以细分为:
    • @Repository:标注一个DAO组件类。
    • @Service:标注一个业务逻辑组件类。
    • @Controller:标注一个控制器组件类。

装配注解

  • @Autowired:用于为类的属性、构造器、方法进行注值。默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualifier**注解进行限定,指定注入的bean名称。
    1. 先获取给定类型的所有bean名称,循环所有的beanName,获取它的实例。
    2. 再通过isTypeMatch方法来确定是否匹配。
    3. 将所有符合类型的放入map。
    4. 如果查找的Bean实例大于1个,通过matchesBeanName方法来确定bean集合中的名称是否与属性的名称相同,找到最合适的那个。
    5. 还确定不了就通过优先级别Primary和Priority注解来确定

常用注解

  • @Configuration:类可以被 Spring 的 IoC 容器所使用,作为 bean 定义的资源。

事务注解

  • @Transactional

SpringMVC注解

  • @Controller:表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将视图呈献给用户。
  • @RequestMapping:将url映射到整个处理类或者特定的处理请求的方法。
  • @RequestParam :将请求的参数绑定到方法中的参数上
  • @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
  • @RequestBody:将方法参数绑定到HTTP请求Body上。
  • @ResponseBody : 将返回类型直接输入到HTTP response body中。(输出JSON格式的数据)