什么是注解
注解就是元数据,即一种描述数据的数据
注解是 JDK1.5 版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。
主要作用:
-
生成文档,通过代码里面标识的元数据生成javadoc文档
-
编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证
-
编译时动态处理,编译时通过代码里标识的元数据动态处理,例动态生成代码
-
运行时动态处理,运行时通过代码里标识的元数据动态处理,例使用反射注入实例
注解:是一种分散式的元数据,与源代码紧绑定
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注解
@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 | 允许子类继承父类中的注解 |