注解(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");