Spring Boot(三)之常用注解分析

本篇会对SpringBoot中常见的注解做解释和分析,其中大部分对于SpringMVC也都适用!

1. @Controller和@RestController

首先@Controller是SpringMVC用于标记Controller类的注解,在Java文档中是这样解释@RestController的:

A convenience annotation that is itself annotated with @Controller and @ResponseBody.

所以,下面两种类的注解是具有同样的意义的:

1
2
3
4
5
6
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }

如果只使用@RestController注解某个Controller类,则Controller中的方法无法返回jsp/html/vm页面。@RestController适合返回JSON、XML类型的数据。

2. @RequestMapping注解

@RequestMapping也是Spring中通用的注解方式,用来映射请求,通过它来指定Controller类可以处理哪些URL请求,我们来看它的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}

Target属性指定了可用于方法和类,path和value都可用于判断接收的URL参数。

如果只将注解用在方法上,如下段代码所示:

1
2
3
4
5
6
7
8
@Controller
public class MyController {
@RequestMapping("/login")
public String login() {
return "success";
}
}

匹配的是根目录的方法,URL便是:

1
http://XXX.com/login

如果将注解同时用于Controller和方法,如下:

1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/login")
public class MyController {
@RequestMapping("/showlogin")
public String login() {
return "success";
}
}

则匹配的REST形式的URL链接便是:

1
http://XXX.com/login/showlogin

如果你不喜欢这种REST形式URL风格,也可以指定参数的方式:

1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/login.do")
public class MyController {
@RequestMapping(params="method=showlogin")
public String login() {
return "success";
}
}

则匹配的URL链接便是:

1
http://XXX.com/login.do?method=showlogin

对于@RequestMapping如果需要,也可以加上请求类型,常见的类型如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.springframework.web.bind.annotation;
public enum RequestMethod {
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
OPTIONS,
TRACE;
private RequestMethod() {
}
}

3. @SpringBootApplication注解

SpringBoot提供了一个方便的@SpringBootApplication,
该注解等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan。

4. @Component注解

@Component被用在要被自动扫描和装配的类上,使用注解@Component就类似于@Service、@Controller等注解。在SpringBoot中,如果你的启动类中没有配置@ComponentScan,则默认扫描同包下的@Component注解的类,如果在启动类中增加以下方式配置:

1
@ComponentScan(basePackages = "com.hts.utils")

则只会扫描com.hts.utils下带有@Component注解的类。

5. @EnableScheduling注解

该注解可让Spring执行任务调度,在你的SpringBoot的启动类中加入@EnableScheduling注解后,可以设置任务类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
public class TestTask {
/**
* 每隔5秒运行
*/
@Scheduled(fixedRate = 5000)
public void runTask() {
System.out.println("Execute in every 5s!");
}
/**
* 每天18:11运行
*/
@Scheduled(cron = "00 11 18 * * ?")
public void runTask2() {
System.out.println("Execute in every 18:11!");
}
}

6. @Bean

@Bean注解用在类的方法上,来显式声明要用生成的类,等价于Spring的XML中配置的bean。
例如新建一个测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Created by zhaoyh on 2017/9/4.
*/
public class TestBean {
private String name;
public TestBean(String name) {
this.name = name;
}
public void test() {
System.out.println("Bean: " + name);
}
}

如果在启动类中加入如下方法:

1
2
3
4
5
6
7
8
9
/**
* 显示生成类
* @return
*/
@Bean
public TestBean getBean() {
TestBean testBean = new TestBean("zhaoyh");
return testBean;
}

则会新建一个bean,其他的类或方法使用自动装配就可以使用该bean:

1
2
@Autowired
private TestBean testBean;

以上内容就是关于SpringBoot常用注解分析的全部内容了,谢谢你阅读到了这里!

Author:zhaoyh