Annotation注解

注解(Annotation): 注解,注解,Java5开始支持。用来给特定的类型装备指定的特性.
元数据(metadata): 描述数据的数据
元注解: 描述注解的注解(@Target,@Retention)

必须存在特定的类型之前(类,方法,构造器,字段,局部变量,包).

在Java中,自带有5个注解:
Java5有3个: @Override / @Deprecated / @SuppressWarings
Java7有1个: @SafeVarargs
Java8有1个: @FunctionalInterface

@Retention:决定了注解可以保留到代码的哪一个时期.
 一个有三个时期,都封装在RetentionPolicy枚举类中:
 * SOURCE: 该注解在编译时就会丢弃,只能存在于源文件中.
 * CLASS: 当字节码加载进JVM,该就丢失.
 * RUINTIME: 一直存在,直到字节码都挂了
自定义的注解类,都是要RUNTIME.

@Target: 决定了注解可以贴在哪些类型之上.
 可以被贴的成员元素类型都封装在ElementType枚举类中.
掌握:
ElementType.TYPE         只能修饰类,接口,枚举
ElementType.METHOD       只能修饰方法
ElementType.FIELD        只能修饰字段(属性),包括枚举常量
了解:
ElementType.ANNOTATION_TYPE只能修饰Annotation
ElementType.CONSTRUCTOR    只能修饰构造方法
ElementType.LOCAL_VARIABLE 只能修饰局部变量
ElementType.PACKAGE      只能修饰包(极少使用)
ElementType.PARAMETER    只能修饰参数

@Documented:  使用@Documented标注的注解会保存到API文档中.
@Inherited:   @Inherited标注的注解可以被子类所继承/遗传.

Spring中的Annotation

DI注解的使用:
1,使用DI注解,在spring的配置文件里面还是需要配置bean, 即IoC还是不能省略的,
 只不过把DI的过程放在了Bean对象中;
2,@Autowired
  1) @Autowired注解可以放在字段上,也可以放在setter方法上面;
 可以把Bean中的对象中的需要的对象属性自动的注入到目标对象中(相当于自动的DI);
  2) @Autowired注解默认有@Required的功能,即只要有@Autowired的属性,
 则必须在IoC中配置唯一对应的Bean, 否则则需要在@Autowired中添加参数:required=false
  4, DI过程
 1,首先按照类型找;
 2,如果没有找到;系统报错(默认情况下,@Autowired注解有一个@Required注解的作用)
 3,如果找到多个,按照字段或者属性的名字(属性名和Bean的id比较),再用名字和类型去找;
  如果1,3都没有找到,报错;
 4,可以通过在字段或者setter方法上添加@Qualifier("yourName")来规定我要注入的bean的名字;
 5,可以在Spring的主要对象上面添加@Autowired,让spring自动注入;
 6,所以,我们的spring的测试类,可以直接引用需要测试的目标对象就可以了;

@Resource
   1,也可以通过@Resource注解来自动注入;
   2,怎么找对象?
     1,首先按照字段或者属性的名字找,如果找不到,则报错,@Resource关联的对象必须存在
     2,如果按照名字找不到,再按照类型来找;
     3,可以通过@Resource的name属性来指定一个bean注入;
 如果一旦设置了@Resource的name属性,就不会去匹配类型;
     5,因为@Resource是javax的注解,所以@Resource不能注入spring中关键的对象;

Ioc注解

使用IoC注解:

1,在配置文件中告诉spring去哪里扫描实例对象, 这个标签只能写一个, 多个包需要使用英文逗号隔开:
 <context:component-scan base-package=""></context:component-scan>
2,在类的前面添加anntation:
  1,@Component:一般我们写在工具类上面;
  2,@Service:一般我们写在服务对象上;
  3,@Repository:一般写在DAO上面;
  4,@Controller:一般写在Action上面;
这四个标签对于spring来说,作用相同,主要是用来区分各个层级的关系的;

<bean id="" class="" factory-method="" factory-bean="" init-method="" destory-method="" scope=""/>
1,id:所有的四个标签都支持value值,这个值就是id的名字;
2,class:已经写了注解,这个就没有意义了;
3,factory-method和factory-bean就没有对应的标签了;
4,init-method:把@PostConstruct直接放在init方法上面;
5,destory-method:把@PreDestroy放在destory方法上面;
6,scope,在类上面添加@Scope("prototype");

原文地址:https://www.cnblogs.com/huike/p/6628909.html