SpringBoot 入门:02 - 实现 MVC

951 阅读2分钟

在上一篇中,我们已经创建了实体类以及映射接口,接下来要做的就是实现处理业务逻辑的 Service 层、控制流程的 Controller 层。

创建业务逻辑层

在项目中创建 service 目录,新建 UserService.java 文件:

package com.foxescap.wxbox.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.foxescap.wxbox.mapper.UserMapper;
import com.foxescap.wxbox.model.User;
import org.springframework.stereotype.Service;

/**
 * @author imxfly
 */
@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    /**
     * 根据用户名获取单个用户
     * @param username 用户名
     * @return 用户
     */
    public User findByUsername(String username) {
        return lambdaQuery().eq(User::getUsername, username).one();
    }
}

以上是根据用户名获取单个用户的一个逻辑,有几点说明一下: • 通过添加 Spring 官方的 @Service 注解自动将该类注入到 Spring 容器中

• 通过继承 MyBatis-Plus 依赖提供的 ServiceImpl<UserMapper, User> 类,就可以很方便的使用它的 query、lambdaQuery 等方法进行链式操作,而不许进行 MyBatis 的 XML 繁琐配置,这就是提高开发效率最大的地方

创建控制流程层

在项目中创建 controller 目录,新建 UserController.java 文件:

package com.foxescap.wxbox.controller;

import com.foxescap.wxbox.model.User;
import com.foxescap.wxbox.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author imxfly
 */
@RestController
public class UserController {

    //@Autowired
    //private UserService userService;
    
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 根据用户名获取用户
     * @param username 用户名
     * @return 用户
     */
    @GetMapping("/user")
    public User findUserByUsername(@RequestParam(name = "username") String username) {
        return userService.findByUsername(username);
    }
}

• 通过 Spring 官方提供的 @RestController 注解自动注入到 Spring 容器中,并且会将返回值放在 Response 体内,而不是返回一个页面。

• 很多人都习惯用 @Autowired 注解来自动注入当前类的实例,但是我个人习惯用构造函数的方式来实现。保持业务逻辑免受 Spring Boot 代码侵入的一种方法是使用构造函数注入。不仅是因为 @Autowired 注解在构造函数上是可选的,而且还可以在没有 Spring 的情况下轻松实例化 Bean,其他优缺点可以去阅读一下下面的参考链接里的第一条。

• 通过 Spring 官方提供的 @GetMapping 注解实现路由的创建。

• 通过 Spring 官方提供的 @RequestParam 注解实现请求参数的绑定。

运行测试

运行起来后,如果没有配置端口,默认是起的 8080,为了能看到有数据,我们在数据库插一条:

INSERT INTO `wxbox`.`user`(`id`, `username`, `secret_key`, `expired_at`, `created_at`) VALUES (1, 'steve', 'xxx', '2020-08-28 00:05:40', '2020-07-07 00:05:47');

然后通过 curl 命令看下:

$ curl http://localhost:8080/user\?username\=steve
{"id":1,"username":"steve","secretKey":"xxx","expiredAt":"2020-08-28T00:05:40","createdAt":"2020-07-07T00:05:47"}

参考链接

Field injection is not recommended – Spring IOC