一、注解的作用:
spring容器是通过把java类注册成bean进行管理的,把java类变成bean有两种方式:
一种是通过xml文件进行配置,把需要的类注册成bean;
还有一种方式就是注解,注解的方式只需要在需要的类前边加上注解。
spring扫描到注解就能把被注解的类自动注册成bean,不同的注解可以被注册成不同的bean,相对于xml配置,使用注解更为方便快捷。也因此越来越多的框架都支持注解配置而放弃xml配置。所以总得来说,注解的作用就是代替手动配置吧,只需要在适当的位置标注一下,就能让框架自己完成具体的配置过程。
二、常见注解
(一)组件类注解
@Component :标准一个普通的spring Bean类。
@Repository:标注一个DAO组件类。
@Service:标注一个业务逻辑组件类。
@Controller:标注一个控制器组件类。
这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。
@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的
@ Controller注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
注意:尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护
(二)装配bean时常用的注解
@PostConstruct 和 @PreDestroy 注解可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。
@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上
不同点:
1.@Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
2.@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualifier**注解进行限定,指定注入的bean名称。
3.@Resource有两个中重要的属性:name和type。@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配
(三)其他常用注解
1.@RequestMapping():为控制器类或者方法指定一个映射的路径,也就是说控制器类或者方法所对应的url,之后就可以通过@RequestMapping()注解指定的路径来访问到对应的类或方法
@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。
@GetMapping
@PostMapping
此外,@RequestMapping还支持带占位符的URL,当userid有值得时候生成完整的URL。Userid的值通过@PathVariable 注解方法进行绑定:
- @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
@RequestMapping(value=”/{userid}”)
Public void login(@PathVariable String userid,Model model){}
2.@RequestParam: 将请求中带的参数绑定到被注解标注的参数上去
Public void login(@RequestParam(value=”username” required=”true”) String username){
}
表示:把请求带过来的参数username赋值给方法中username这个参数。Required代表参数是否必须,可以不写,默认为true,当不能确定请求中存在value的值得这个参数的时候,就必须把设置required的值为false。
3.@RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
//可以绑定自定义的对象类型
}
4.@ResponseBody : @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。
@ResponseBody在输出JSON格式的数据时,会经常用到。
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {
return "Hello World";//返回String类型
}
5.@RestController :控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。
6.@Transational: spring事务管理的注解,被注解的方法或类就自动被注册成事务接收spring容器的管理