什么是注解
-
注解有检查与约束的规范
-
Annotation是从JDK5.0开始引入的新技术。
- 不是程序本身,可以对程序作出解释(这一-点和注释(comment)没什么区别)。
- 可以被其他程序(比如:编译器等)读取。
-
◆Annotation的格式:
- 如:@SuppressWarnings(value=“unchecked”).
-
Annotation在哪里使用?
-
可以附加在package , class , method, field等上面,相当于给他们添加了额外的辅助信息。
-
我们可以通过反射机制编程实现对这些元数据的访问
-
注解分为元注解和内置注解
元注解
-
元注解的作用就是负责注解其他注解, Java定义了4个标准的meta -annotation类型,他们被用来提供对其他annotation类型作说明.
-
这些类型和它们所支持的类在java.lang.annotation包中可以找到 ( @Target , @Retention,@Documented , @Inherited )
(SOURCE < CLASS < RUNTIME)
- @Target :用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
- @Retention :表示需要在什么级别保存该注释信息,用于描述注解的生命周期
- @Document: 说明该注解将被包含在javadoc中
- @Inherited: 说明子类可以继承父类中的该注解
内置注解
-
@Override :定义在java.lang.Override中, 此注释只适用于修辞方法,表示-个方法声明打算
重写超类中的另一个方法声明. -
@Deprecated :定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示不
鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择. -
@SuppressWarnings :定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息.
与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,
我们选择性的使用就好了.- @SuppressWarnings(“ll”)
- @SuppressWarnings(“unchecked”)
- @SuppressWarnings(value={“unchecked” “deprecation”})
自定义注解
-
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
- @ interface用来声明一个注解,格式: public @ interface注解名{定义内容}
- 其中的每-一个方法实际 上是声明了一个配置参数.
- 方法的名称就是参数的名称.
- 返回值类型就是参数的类型(返回值只能是基本类型 ,Class , String , enum ).
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值,我们定义注解元素时, 经常使用空字符串,0作为默认值
简单的自定义注解
//定义一个注解
//Target 用来标识该注解用来放在什么位置 分别为 类上 方法上 。。。
@Target({ElementType.TYPE,ElementType.METHOD})
//Retention 标识我们的注解在什么时候有效
@Retention(RetentionPolicy.RUNTIME)
//表示我们的注解生成在javaDoc中
@Documented
//表示子类可以继承父类的注解
@Inherited
@interface myAnnotation{}
比较复杂的自定义注解
@myAnnotation()
public class Demo01 {}
//定义一个注解
//Target 用来标识该注解用来放在什么位置 分别为 类上 方法上 。。。
@Target({ElementType.TYPE,ElementType.METHOD})
//Retention 标识我们的注解在什么时候有效
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation{
String name() default "";
int age() default 1;
//代表不存在 和indexOf 差不多 找不到就返回-1
int id() default -1;
String[] gri() default {"a","b"};
}
如果注解的变量不带默认值的话在使用的时候要显示的调用
@myAnnotation(name = "Mayb")
public class Demo01 {}
//定义一个注解
//Target 用来标识该注解用来放在什么位置 分别为 类上 方法上 。。。
@Target({ElementType.TYPE,ElementType.METHOD})
//Retention 标识我们的注解在什么时候有效
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation{
String name() ;
int age() default 1;
//代表不存在 和indexOf 差不多 找不到就返回-1
int id() default -1;
String[] gri() default {"a","b"};
}
如果只有一个变量的话可以使用value 可以在使用时直接写参数
@myAnnotation1("Mayb")
public class Demo01 {
}
@interface myAnnotation1{
String value();
}
其他注解
这里 的注解可能在未来使用中会陆续编辑修改
1、@Controller
@Controller用于标记在一个类上,使用它标记的类就是一个SpringMvc Controller对象,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了**@RequestMapping注解。
@Controller只是定义了一个控制器类,而使用@RequestMapping**注解的方法才是处理请求的处理器。
2、@Configuration
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被 @Bean 注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
注意:@Configuration注解的配置类有如下要求:
1、@Configuration不可以是final类型;
2、@Configuration不可以是匿名类;
3、嵌套的@Configuration必须是静态类。
3、@Component
1、@Controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层
2、@Service 服务(注入dao)
用于标注服务层,主要用来进行业务的逻辑处理
3、@Repository(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
4、@Component (把普通pojo实例化到spring容器中,相当于配置文件中的
)
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于 @Controller 、@Services等的时候),我们就可以使用 @Component 来标注这个类。
案例:
<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
共同点:被 @Controller 、@Service、@Repository、@Component注解的类,都会把这些类纳入进spring容器中进行管理