ava注解(Annotation)是经过在java源文件上添加标记字段,而后经过反射的反射在编译或者运行时获取这些标记字段以及其标记目标,而后进行相应处理的方法,曾经风靡一时的XDoclet就是最先的java注解的工做原理说明。使用注解能够进行某些配置,大大减小xml配置文件的书写麻烦,可是也有人认为注解方式不方便理解和维护,所以对于注解VS XML配置文件一直争论不断,我的感受没有好坏之分,合适就是最好的。java
(1).JDK内置注解:spring
JDK内置了3个注解:框架
a. @Override:声明某个方法被重写。ide
b. @Deprectated:声明某个方法过期,不推荐使用。spa
c. @SuppressWarning({“unchecked”,…….}):告诉编译器对于那些警告信息忽略。code
(2).自定义java注解:component
Java注解就是一种特殊的接口,自定java注解很是方便,简单例子以下:orm
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.CLASS) public @interface TestAnnotation{ String value() default “”; }
3).若要想自定义的注解能够被继承,则须要在自定义注解类上加上“@Inherited”注解。xml
注意和说明:对象
a. java的注解其实是自动继承了java.lang.annotation.Annotation接口,所以在自定义注解时不能继承其余的注解或者接口。
b. Retention:告诉编译器如何处理注解,即注解运行在什么时刻。
RetentionPolicy是个枚举类型,有如下三种状态值:
1).SOURCE:该注解存储在源文件中,编译事后即废弃。
2).CLASS:该注解存储在class文件中,是其缺省的值。
3).RUNTIME:该注解存储在class文件中,而且有Java虚拟机读入解析,该类型很是重要,可使用反射机制获取注解相关信息,能够进行程序分析处理。
c. @Target:指定注解的目标使用对象。
ElementType也是个枚举类型,有如下几种状态值:
1).TYPE:该注解适用于class,interface,enum等类级别的目标对象。
2).FIELD:该注解适用于类中字段级别的目标对象。
3).METHOD:该注解适用于类中方法级别的目标对象。
4).PARAMETER:该注解适用于方法参数级别的目标对象。
5).CONSTRUCTOR:该注解适用于类构造方法。
6).LOCAL_VARIABLE:该注解适用于局部变量。
7).ANNOTATION_TYPE:该注解适用于annotation对象。
8).PACKAGE:该注解适用于package对象。
d.注解里面只能声明属性,不能声明方法,声明属性的方式比较特殊:
语法格式为:数据类型 属性() default 默认值(默认值是可选的); 如:Stringvalue();
使用时,“注解对象(属性=属性值)”为注解指定属性值,经过“注解对象.属性;”就能够获得注解属性的值。
e.注解的解析:使用java反射机制得到注解的目标对象就能够获得注解对象,如:
经过反射获得了注解目标的Field对象field,则经过“field.getAnnotation(注解类.class);”就能够获得注解对象。
9. 基于注解的Spring配置准备条件:
从Spring2.5之后,Spring开始全面支持注解方式配置,因此能够不用写xml配置文件,同样可使用spring。
(1).使用spring注解方式,必须加入spring注解方式所依赖的jar包:common-annotation.jar。
(2).使用注解方式时,必须在spring配置文件的schema中添加注解的命名空间以下:
xmlns:context=”http://www.springframework.org/schema/context” http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
(3).在spring配置文件中注册注解处理器:
在spring配置文件中<.bean>元素以前添加:
< context:annotation-config >
10. 基于注解的spring配置:
Spring2.5中使用四个注解按功能来进行对bean的配置:
(1).@Component:泛指组件,对于通常很差归类的java Bean使用。
(2).@Service:用于标注配置业务层(service层)组件。
(3).@Controller:用于标注配置控制层的组件(如Struts中的action)。
(4).@Repository:用于标注配置数据访问层组件,即通常的DAO层Bean对象。
注意:对于使用spring注解方式配置的bean对象,bean引用时默认名称为被注解名称的首字母小写形式,也能够指定名称,如:@Service(“userDao“)。
11. Spring的自动装配:
自动装配的是指不用手动显式配置java Bean之间依赖关系,而是让spring依据某种规则自动将合适的对象注入到目标对象的过程。Spring中经常使用@Autowire和@Resource来进行自动装配。
(1).@Autowire:默认是按照对象的数据类型进行自动装配的,如
@Autowire private UserDao userDao;
spring框架在运行时会自动将类型为UserDao的对象注入进来。
(2).@Resource:默认是按照名称或者Id进行自动装配的,只有当找不到匹配的名称或者Id时才按类型进行装配,如:
@Resource(name=”userDao”) private UsreDao userDao;
spring框架在运行时会将配置名称或者id为“userDao”的对象注入进来。
注意:@Autowire和@Resource都既能够写在字段上,也能够写在set方法上。
12. Spring的自动扫描:
Spring自动扫描机制是指,咱们使用基于注解的spring配置方式后,spring的配置文件中只须要注册注解处理器,不用显式地配置Bean,当spring在运行时会自动扫描根据给定的条件下类路径中的全部bean,根据注解将它们注入和装配起来并进行初始化的过程。
自动扫描很简单,只须要在spring的配置文件中添加如:
< context:component-scan base-package =“要自动扫描的包名“ >
Spring在运行时就能够对指定的包中全部添加了Spring注解的bean自动扫描,注入,装配和初始化。
注意:基于注解的spring配置,自动装配和自动扫描是紧密联系在一块儿协同工做的,都须要引入context的命名空间。