SpringBoot 学习一

125 阅读4分钟
原文链接: my.oschina.net

本文将从以下几个方面介绍:

前言

HelloWorld 

读取配置文件

例子(CURD)

前言

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。(百度百科)

通过 SpringBoot,不再需要写很多的配置文件了, 比如 web.xml , bean.xml 等,它使用“习惯大于配置”的原则;可以简化我们的开发工作,

HelloWorld

下面就来学习一下怎么使用,搭建环境就不写了:

# HelloController

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping("/")
    public String hello(){
        return "hello world";
    }
}

通过 @RestController 注解来标识它是一个控制层,它是 @Controller 和 @ResponseBody 组合;通过 @RequestMapping 注解来映射请求,之后,启动应用程序,是通过 main 方法来启动的:

#SpringbootApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyspringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyspringbootApplication.class, args);
    }
}

通过 @SpringBootApplication 注解来启动 SpringBoot项目,启动后,在浏览器输入 http://localhost:8080/hello/ 即可:

如果要返回页面也是很方便的,把 @RestController 注解换为 @Controller,之后再返回到对应的页面即可。如下所示:

首先模拟一个服务层提供数据:

# PersonService 

import com.google.common.collect.Lists;
import myspringboot.myspringboot.pojo.Person;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class PersonService {
    private List<Person> persons = Lists.newArrayList();

    public List<Person> queryPersons(){
        persons.add(new Person(1, "zhangsan", "java", 24));
        persons.add(new Person(2, "lisi", "python", 25));
        persons.add(new Person(3, "wangwu", "C++", 22));
        persons.add(new Person(4, "zhaoliu", "Redis", 24));
        persons.add(new Person(5, "jqjq", "C", 23));
        return persons;
    }
}

通过 @Component 注解把该 bean 注入到Spring 容器中去,即配置bean,

之后模拟控制层去取数据返回到页面显示:

#Person2Controller 

import myspringboot.myspringboot.pojo.Person;
import myspringboot.myspringboot.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;

@Controller
public class Person2Controller {

    @Autowired
    private PersonService personService;

    @RequestMapping(value = "/queryPersons")
    public String queryPersons(ModelMap map){
        List<Person> persons = personService.queryPersons();
        map.addAttribute("persons", persons);
        return "index";
    }
}

index.html 代码如下:

<body>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>工作</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="person:${persons}">
                <td th:text="${person.id}">中</td>
                <td th:text="${person.name}">中</td>
                <td th:text="${person.age}">中</td>
                <td th:text="${person.job}">中</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

之后启动应用程序,浏览器输入:http://localhost:8080/queryPersons 即可看到数据:

读取配置文件

在 SpringBoot 项目中,有一个默认的配置文件 application.properties,如果需要配置相关数据,在该文件中配置即可;如果某个 POJO 对象的值需要配置在配置文件中,则可以通过如下方式来获取:

首先需要定义一个 POJO 对象:

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Getter
@Setter
@ToString
@Component
public class BlogProperties {

    @Value("${blog.name}")
    private String name;

    @Value("${blog.title}")
    private String title;

    @Value("${blog.desc}")
    private String desc;

    @Value("${blog.content}")
    private String content;

    @Value("${blog.author}")
    private String author;

    @Value("${blog.date}")
    private String date;

}

同样, 通过 @Component 注解注入到 Spring 容器中去,之后,可以通过 @Value("${xxx}") 来获取配置文件中对应的值了。在 application.properties,配置文件中添加如下信息:

blog.name=java
blog.title=java core
blog.desc=java python redis
blog.content=java java java java java 
blog.author=tsmyk0715
blog.date=2018-9-23

通过单元测试下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyspringbootApplication.class)
public class BlogPropertiesApplicationTests {

    @Autowired
    private BlogProperties blog;

    @Test
    public void testBlogProperties(){
        System.out.println(blog.getName());
        System.out.println(blog.getContent());
        System.out.println(blog.getAuthor());
        System.out.println(blog);
    }

// 结果
java
java java java java java 
tsmyk0715
BlogProperties(name=java, title=java core, desc=java python redis, content=java java java java java , author=tsmyk0715, date=2018-9-23)
}

例子(CURD)

接下来看下一个增删改查的例子:

1. 首先定义一个 POJO 对象,共 四个属性:

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable
{
    private int id;
    private String name;
    private String job;
    private int age;
}

之后模拟控制层来接受请求,返回数据:

@RestController
@RequestMapping("/persons")
public class PersonController {

    private Map<Integer, Person> persons = Maps.newHashMap();

    /**
     * 查询所有的用户
     * @return
     */
    // 处理 /persons/ 的请求, GET 请求表示获取操作
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public List<Person> getPersons(){
        return new ArrayList<>(persons.values());
    }

    /***
     * 添加用户
     * @param person
     * @return
     */
    // 处理 /persons/ 的请求, POST 请求表示添加操作
    @RequestMapping(value = "/", method = RequestMethod.POST)
    public String addPerson(@ModelAttribute Person person){
        persons.put(person.getId(), person);
        return "success";
    }

    /**
     * 根据ID查询用户
     * @param id
     * @return
     */
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public Person getPersonById(@PathVariable int id){
        return persons.get(id);
    }

    /**
     * 更新用户信息
     * @param id
     * @param person
     * @return
     */
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public String updatePerson(@PathVariable int id, @ModelAttribute Person person){
        Person oldPerson = persons.get(id);
        oldPerson.setName(person.getName());
        oldPerson.setAge(person.getAge());
        oldPerson.setJob(person.getJob());
        persons.put(id, oldPerson);
        return "success";
    }

    /**
     * 删除用户
     * @param id
     * @return
     */
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public String deletePerson(@PathVariable int id){
        persons.remove(id);
        return "success";
    }

}

接下来,进行单元测试,使用的使用 Spring 提供的  Mock 工具类进行测试:

import myspringboot.myspringboot.web.PersonController;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MockServletContext.class)
@WebAppConfiguration
public class PersonApplicationTests {

    private MockMvc mvc;

    @Before
    public void setup(){
        mvc = MockMvcBuilders.standaloneSetup(new PersonController()).build();
    }

    @Test
    public void testPerson() throws Exception{
        RequestBuilder request = null;
        // 第一次查询,为空
        request = MockMvcRequestBuilders.get("/persons/");
        mvc.perform(request)
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content()
                        .string(Matchers.equalTo("[]")));


        // post 添加一个用户
        request = MockMvcRequestBuilders.post("/persons/")
                .param("id", "1")
                .param("name", "tsmyk0715")
                .param("age", "25")
                .param("job", "java");
        mvc.perform(request)
                .andExpect(MockMvcResultMatchers.content()
                        .string(Matchers.equalTo("success")));

        request = MockMvcRequestBuilders.get("/persons/1");
        mvc.perform(request)
                .andDo(MockMvcResultHandlers.print());

        // 添加另一个用户
        request = MockMvcRequestBuilders.post("/persons/")
                .param("id", "2")
                .param("name", "tsmyk")
                .param("age", "26")
                .param("job", "python");
        mvc.perform(request)
                .andExpect(MockMvcResultMatchers.content()
                        .string(Matchers.equalTo("success")));

        // 查询所有用户
        request = MockMvcRequestBuilders.get("/persons/");
        mvc.perform(request)
                .andDo(MockMvcResultHandlers.print());


        // 删除用户
        request = MockMvcRequestBuilders.delete("/persons/1");
        mvc.perform(request)
                .andExpect(MockMvcResultMatchers.content()
                        .string(Matchers.equalTo("success")));

        request = MockMvcRequestBuilders.get("/persons/1");
        mvc.perform(request)
                .andDo(MockMvcResultHandlers.print());
    }
}

以上就是 SpringBoot 的一个简单使用。