Java和Spring注解基本介绍

前言
   
   
  1. 注解早在J2SE1.5就被引入到Java中,主要提供一种机制,这种机制允许程序员在编写代码的同时可以直接编写元数据。
  2. 注解可以被用在包,类,方法,变量,参数上。自Java8起,有一种注解几乎可以被放在代码的任何位置,叫做类型注解。
  3. 注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻辑。
  4. 当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中可用,在编译时不可用的注解。
java注解
   
   
  1. import java.lang.annotation.Documented;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Inherited;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. @Documented
  8. @Target(ElementType.METHOD)
  9. @Inherited
  10. @Retention(RetentionPolicy.RUNTIME)
  11. public @interface MethodInfo{
  12. String author() default "Pankaj";
  13. String date();
  14. int revision() default 1;
  15. String comments();
  16. }
    
    
  1. 注解方法不能有参数
  2. 注解方法的返回类型局限于原始类型(8中基本数据类型),字符串,枚举,注解,或以上类型构成的数组。
  3. 注解方法可以包含默认值
  4. 注解可以包含与其绑定的元注解,元注解为注解提供信息,有四种元注解类型:
            
            
    1. 1. @Documented 
    2. 表示使用该注解的元素应被javadoc或类似工具文档化,它应用于类型声明,类型声明的注解会影响客户端对注解元素的使用。
    3. 如果一个类型声明添加了Documented注解,那么它的注解会成为被注解元素的公共API的一部分。
    4. 2. @Target 
    5. 表示支持注解的程序元素的种类,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。
    6. 如果Target元注解不存在,那么该注解就可以使用在任何程序元素之上。
    7. 3. @Inherited 
    8. 表示一个注解类型会被自动继承,如果用户在类声明的时候查询注解类型,同时类声明中也没有这个类型的注解,
    9. 那么注解类型会自动查询该类的父类,这个过程将会不停地重复,直到该类型的注解被找到为止,或是到达类结构的顶层(Object)。
    10. 4. @Retention 
    11. 表示注解类型保留时间的长短,它接收RetentionPolicy参数,可能的值有SOURCE, CLASS, 以及RUNTIME

  • @Target用于提示该注解使用的地方,取值有:
     
     
  1. public enum ElementType {
  2. /** Class, interface (including annotation type), or enum declaration */
  3. TYPE,
  4. /** Field declaration (includes enum constants) */
  5. FIELD,
  6. /** Method declaration */
  7. METHOD,
  8. /** Formal parameter declaration */
  9. PARAMETER,
  10. /** Constructor declaration */
  11. CONSTRUCTOR,
  12. /** Local variable declaration */
  13. LOCAL_VARIABLE,
  14. /** Annotation type declaration */
  15. ANNOTATION_TYPE,
  16. /** Package declaration */
  17. PACKAGE,
  18. /**
  19. * Type parameter declaration
  20. * @since 1.8
  21. */
  22. TYPE_PARAMETER,
  23. /**
  24. * Use of a type
  25. * @since 1.8
  26. */
  27. TYPE_USE
  28. }


  • 分别表示该注解可以被使用的地方:
    • 1)类,接口,注解,enum;
    •  2)属性域;
    • 3)方法;
    • 4)参数;
    • 5)构造函数;
    • 6)局部变量;
    • 7)注解类型;
    • 8)包

  • @Retention用于提示注解被保留多长时间,有三种取值:

      
      
  1. public enum RetentionPolicy {
  2. /**
  3. * Annotations are to be discarded by the compiler.
  4. */
  5. SOURCE,
  6. /**
  7. * Annotations are to be recorded in the class file by the compiler
  8. * but need not be retained by the VM at run time. This is the default
  9. * behavior.
  10. */
  11. CLASS,
  12. /**
  13. * Annotations are to be recorded in the class file by the compiler and
  14. * retained by the VM at run time, so they may be read reflectively.
  15. *
  16. * @see java.lang.reflect.AnnotatedElement
  17. */
  18. RUNTIME
  19. }

     
     
    • RetentionPolicy.SOURCE 保留在源码级别,被编译器抛弃(@Override就是此类); 
    • RetentionPolicy.CLASS被编译器保留在编译后的类文件级别,但是被虚拟机丢弃【默认】
    • RetentionPolicy.RUNTIME保留至运行时,可以被反射读取

spring的bean容器相关的注解

    1)@Autowired 是我们使用得最多的注解,其实就是 autowire=byType 就是根据类型的自动注入依赖(基于注解的依赖注入),可以被使用再属性域,方法,构造函数上。

    2)@Qualifier 就是 autowire=byName, @Autowired注解判断多个bean类型相同时,就需要使用 @Qualifier("xxBean") 来指定依赖的bean的id:

        
        
  1. @Controller
  2. @RequestMapping("/user")
  3. public class HelloController {
  4. @Autowired
  5. @Qualifier("userService")
  6. private UserService userService;

    3)@Resource 属于JSR250标准,用于属性域额和方法上。也是 byName 类型的依赖注入。使用方式:@Resource(name="xxBean"). 不带参数的 @Resource 默认值类名首字母小写。

    4)JSR-330标准javax.inject.*中的注解(@Inject, @Named, @Qualifier, @Provider, @Scope, @Singleton)。@Inject就相当于@Autowired, @Named 就相当于 @Qualifier, 另外 @Named 用在类上还有 @Component的功能。

    5)@Component, @Controller, @Service, @Repository, 这几个注解不同于上面的注解,上面的注解都是将被依赖的bean注入进入,而这几个注解的作用都是生产bean, 这些注解都是注解在类上,将类注解成spring的bean工厂中一个一个的bean。@Controller, @Service, @Repository基本就是语义更加细化的@Component。

    6)@PostConstruct 和 @PreDestroy 不是用于依赖注入,而是bean 的生命周期。类似于 init-method(InitializeingBean) destory-method(DisposableBean)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值