SpringBoot入门教程(三):SpringBoot 常用注解

一、基本介绍

@SpringBootApplication:

包含@Configuration、@EnableAutoConfiguration、@ComponentScan

通常用在主类上。
SpringBoot入门教程(三):SpringBoot 常用注解

@Repository:

用于标注数据访问组件,即DAO组件。

 

@Service:

用于标注业务层组件。

 

@Controller:

用于标注控制器组件

 

@RestController:

用于标注控制层组件,包含@Controller和@ResponseBody。

 

@ResponseBody:

表示该方法的返回结果直接写入HTTP response body中

一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。

 

@Component:

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

 

@ComponentScan:

组件扫描。个人理解相当于<context:component-scan>,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean。

 

@Configuration:
指出该类是 Bean 配置的信息源,相当于XML中的<beans></beans>,一般加在主类上。

 

@Bean:

相当于XML中的<bean></bean>,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

 

@EnableAutoConfiguration:

让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,一般加在主类上。

 

@AutoWired:

byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

当加上(required=false)时,就算找不到bean也不报错。

 

@Qualifier:

当有多个同一类型的Bean时,可以用@Qualifier("name")来指定。与@Autowired配合使用

 

@Resource(name="name",type="type"):

没有括号内内容的话,默认byName。与@Autowired干类似的事。

 

@RequestMapping:

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
该注解有六个属性:

params:指定request中必须包含某些参数值是,才让该方法处理。

headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

value:指定请求的实际地址,指定的地址可以是URI Template 模式

method:指定请求的method类型, GET、POST、PUT、DELETE等

consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;

produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

 

@RequestParam:

用在方法的参数前面。

@RequestParam String a =request.getParameter("a")。

 

下面将对上面常用注解进行介绍

 

二、举例介绍

1、@ComponentScan

SpringBoot 默认是扫描启动类所在包下的所有含有 @Component、@Repository、@Service、@Controller 的类

SpringBoot入门教程(三):SpringBoot 常用注解

当然也相当于在启动类上加了

  1. @ComponentScan(basePackages = {"com.liuyanzhao.demo"})

 

2、@Component、@Repository、@Service、@Controller

为了控制反转(将创建对象的控制权交给Spring容器),而不需要去 new,而且创建的对象还是单例的,一举多得。

这几个注解作用是通用的,几乎一样,通常我们根据它的含义来写

注解含义
@Component最普通的组件,可以被注入到spring容器进行管理
@Repository作用于持久层
@Service作用于业务逻辑层
@Controller作用于表现层(spring-mvc的注解)

注意:这些注解都是写在类上面的,不可以写在接口上,默认是创建类名首字母小写的 Bean

 

3、@AutoWired 和 @Resource

这两个注解都是注入依赖的作用

比如在 UserController 里注入 UserService,在 UserService 注入 UserDao

通常用法如下

UserServiceImpl 类

  1. @Service
  2. //相当于 @Service(value = "userServiceImpl")
  3. public class UserServiceImpl implements UserService{
  4.     @Override
  5.     public String sayHi() {
  6.         return "Hi!";
  7.     }
  8. }

利用@Service注解自动将类 UserServiceImpl 注解为bean,id为 userServiceImpl,即类 UserServiceImpl 第一个字母小写的id。

 

@Authwired 使用

  1. //方法一、寻找可以扫描到的实现了 UserService 接口的类
  2. @Autowired
  3. private UserService userService;
  4. //方法二、如果有多个类实现了 UserService,需要指定时哪个实现类
  5. @Autowired
  6. @Qualifier("userServiceImpl")
  7. private UserService userService;

 

@Resource 使用

  1. //方法三、寻找可以扫描到的实现了 UserService 接口的类
  2. @Resource
  3. private UserService userService;
  4. //方法四、如果有多个类实现了 UserService,需要指定时哪个实现类
  5. @Resource(name = "userServiceImpl")
  6. private UserService userService;

 

区别

1)利用@Service注解自动将类 UserServiceImpl 注解为bean,id为 userServiceImpl,即类 UserServiceImpl 第一个字母小写的id。

2)@Resource按byName自动注入,@Autowired按byType自动注入;

3)@Resource可用@Autowired替换

 

 

4、@RequestMapping

该注解可以加在方法上,也可以加在类上;如下面例子,加在类上,表示该类所有的方法都加前缀 /user

下面两种方法都是映射到 /user/list

方法一、

  1. @RestController
  2. public class UserController {
  3.     @Autowired
  4.     private UserService userService;
  5.     @RequestMapping(value = "/user/list",method = RequestMethod.GET)
  6.     //相当于 @GetMapping("/user/list")
  7.     public List<User> userList() {
  8.         return userService.listUsers();
  9.     }
  10. }

 

方法二、

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4.     @Autowired
  5.     private UserService userService;
  6.     @RequestMapping(value = "/list",method = RequestMethod.GET)
  7.     //相当于 @GetMapping("/list")
  8.     public List<User> userList() {
  9.         return userService.listUsers();
  10.     }
  11. }

 

5、@RequestParam

@RequestParam 是修饰参数的,默认是必须传该参,也可以设置不是必须和未传参的默认值

  1. /**
  2.     * URL例子:/user/list?page=1&size=10
  3.     * <p>
  4.     * 参数加了 @RequestParam("page")表示
  5.     * 1、默认该参数必选
  6.     * 2、参数名为page(而pageIndex只是形参,随便啥都可以)
  7.     * 3、可以设置参数是否必须,默认值
  8.     *
  9.     * @param pageIndex
  10.     * @param pageSize
  11.     * @return
  12.     */
  13.    @GetMapping("/list")
  14.    public List<User> userList(@RequestParam("page") Integer pageIndex,
  15.                               @RequestParam(value = "size", required = false, defaultValue = "10") Integer pageSize) {
  16.        System.out.println(pageIndex);
  17.        System.out.println(pageSize);
  18.        return userService.listUsers(pageIndex, pageSize);
  19.    }

 

6、@PathVariable

@PathVariable是绑定URL上的变量值的(注意是URL上的,不是参数)

  1. /**
  2.      * /user/{id} 中花括号里的 id 和 @PathVariable("id") 中的id匹配
  3.      * @param id
  4.      * @return
  5.      */
  6.     @GetMapping("/user/{id}")
  7.     public User getUser(@PathVariable("id") Integer id) {
  8.         return userService.getUserById(id);
  9.     }

 

7、@Controller 和 @RestController

使用 @Controller,视图解析器可以在 return 的 jsp 或 html 页面上渲染内容,然后返回给对应的 URL

假如我们使用 Thymeleaf 作为模板引擎,我们最好在配置文件 application.properties 里添加如下代码

  1. spring.thymeleaf.prefix=classpath:/templates/
  2. spring.thymeleaf.suffix=.html

这样设置,可以让我们在 controller 设置映射的模板页面的路径减少一点,就是避免以下不必要的公共的部分

(1)@Controller (返回渲染后的 HTML 页面)

然后我们的 controller 可以这样

  1. @Controller
  2. public class UserController {
  3.     @Autowired
  4.     private UserService userService;
  5.     @GetMapping("/user/list")
  6.     public ModelAndView userList() {
  7.         ModelAndView modelAndView = new ModelAndView();
  8.         List<User> userList = userService.listUsers();
  9.         modelAndView.addObject("userList",userList);
  10.         //表示渲染在 templates/user/list.html
  11.         modelAndView.setViewName("user/list");
  12.         return modelAndView;
  13.     }
  14. }

使用 ModelAndView 需要传入 model 和 view,可以通过构造器传入,也可以直接通过 Getter/Setter传入。

当然,其实也可以直接返回 String 类型,像这样

  1. @Controller
  2. public class UserController {
  3.     @Autowired
  4.     private UserService userService;
  5.     @GetMapping("/user/list")
  6.     public String userList(Model model) {
  7.         List<User> userList = userService.listUsers();
  8.         model.addAttribute("userList", userList);
  9.         return "user/list";//表示渲染在 templates/user/list.html
  10.     }
  11. }

是不是优雅点。

 

(2)@Controller + @ResponseBody (直接返回字符串/JSON字符串)

返回String类型的话,直接返回原字符;返回对象的话,会返回 JSON 格式

  1. @Controller
  2. public class UserController {
  3.     @GetMapping("/user/list")
  4.     @ResponseBody
  5.     public User userList() {
  6.         User user = new User();
  7.         user.setId(001);
  8.         user.setAge(19);
  9.         user.setName("张三");
  10.         return user;
  11.     }
  12. }

在浏览器访问 localhost:8080/user/list

SpringBoot入门教程(三):SpringBoot 常用注解

使用 Chrome 浏览器,建议安装一个插件 JSON Viewer,可以在浏览器格式化 JSON 字符串,显示更有结构

SpringBoot入门教程(三):SpringBoot 常用注解

 

(3)@RestController

效果和(2)是一模一样的,都是返回字符串

  1. @RestController
  2. public class UserController {
  3.     @GetMapping("/user/list")
  4.     public User userList() {
  5.         User user = new User();
  6.         user.setId(001);
  7.         user.setAge(19);
  8.         user.setName("张三");
  9.         return user;
  10.     }
  11. }

 

  • 微信
  • 赶快加我聊天吧
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
广告也精彩
言曌
广告也精彩

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: