什么是注解

注解就是元数据,即一种描述数据的数据

注解是 JDK1.5 版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。

主要作用:

  1. 生成文档,通过代码里面标识的元数据生成javadoc文档

  2. 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证

  3. 编译时动态处理,编译时通过代码里标识的元数据动态处理,例动态生成代码

  4. 运行时动态处理,运行时通过代码里标识的元数据动态处理,例使用反射注入实例

注解:是一种分散式的元数据,与源代码紧绑定

XML:是一种集中式的元数据,与源代码无绑定

注解介绍:

一:组件类注解

@Component:标准一个普通的spring Bean类

@Repository:标注一个 DAO 组件类

@Service:标注一个业务逻辑组件类

@Controller:标注一个控制器组件类

@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。

二:装配 bean 时常用的注解

@Autowired:属于 spring 的注解,可用于为类的属性、构造器、方法进行 注入值

@Resource:不属于 spring 的注解,而是来自于 JSR-250 规范位于 java.annotation 包下

@PostConstruct 和 @PreDestroy:主要实现初始化和销毁 bean 之前进行的操作

@Resource 的作用相当于 @Autowired,均可标注在字段或属性的 setter 方法上

@Autowired 只按照 Type 注入

@Resource 默认按照 Name 自动注入,也提供按照 Type 注入

三:@Autowired 与 @Resource 的区别

@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称。

@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 。

四:@Configuration 和 @Bean

从Spring3.0开始,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法

@Configuration可理解为以前用Spring的时候xml里面的<beans/>标签 @Bean可理解为以前用Spring的时候xml里面的<bean/>标签

@Controller 注解

表明该类会作为与前端作交互的控制层组件,可以发布接口服务供前台调用。达到前后台交互的目的

@RequestMapping 注解

这个注解用于将 url 映射到整个处理类或者特定的处理请求的方法,还支持通配符,方便定义restful风格的接口

@RequestParam注解

将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true,也就是该参数必须要传。如果该参数可以传可不传,可以配置required=false

应用场景:可以绑定url问号后面的参数,也可以绑定表单传入的参数

@PathVariable注解

该注解用于修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。

应用场景:可以绑定url上面的动态参数,主要用于定制Restful风格的接口

@RequestBody注解

可以将前台传入的参数绑定到指定的对象上,一般用户传递复杂参数。

应用场景:用于对象类型等绑定复杂参数

@ResponseBody注解

@ResponseBody与@RequestBody类似,主要应用在接口的返回参数上。在前台异步请求,输出JSON格式的数据时,会经常用到。

@RestController注解

@RestController用来创建REST类型的控制器,与@Controller类型相比,它避免了你重复的写 @ResponseBody注解,每个方法默认都会加上这个注解

@ModelAttribute注解

@ModelAttribute可以作用在方法或方法参数上,使用场景较复杂,正常使用较少

@Tatget表示该注解可以用于什么地方,可能的ElementType参数有: CONSTRUCTOR:构造器的声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类型)或enum声明
@Retention 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括: SOURCE:注解将被编译器丢弃 CLASS:注解在class文件中可用,但会被VM丢弃 RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。
@Document 将注解包含在Javadoc
@Inherited 允许子类继承父类中的注解



posted on 2021-01-06 16:44  白糖℃  阅读(324)  评论(0编辑  收藏  举报