springboot与springMVC对比学习

开发模式比较

1.springmvc会在web.xml文件中配置DispatcherServlet,负责截获,处理所有请求,如下的配置:

<!-- 前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 默认找 /WEB-INF/[servlet的名称]-servlet.xml -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <init-param>
        <param-name>dispatchOptionsRequest</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

2. 在 Spring MVC 配置文件中,声明预定义的控制器和视图解析器等

3. 编写预定义的处理请求控制器

4. 编写预定义的视图对象,比如 JSP、Freemarker 等

springboot mvc会省略前两步,

1. 编写预定义的处理请求控制器

2. 编写默认 ThymeLeaf 视图对象

@Controller
@RequestMapping(value = "/users") 
public class UserController
{
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/user/index")
    public String index(){
        return "user/index";
    }

    @RequestMapping(value = "/user/show",method = RequestMethod.GET)
    @ResponseBody
    public String show(@RequestParam(value = "name")String name){
        User user = userService.findUserByName(name);
        if(null != user)
            return user.getId()+"/"+user.getName();
        else return "null";
    }


}

@Controller 注解在 UserController 类上,标识其为一个可接收 HTTP 请求的控制器

@RequestMapping(value = "/users") 注解 ,标识 UserController 类下所有接收的请求路由都是 /users 开头的。注意:类上的 @RequestMapping 注解是不必需的

@RequestMapping(method = RequestMethod.GET) 注解,标识该 getUserList(ModelMap map) 方法会接收并处理 /users 请求,且请求方法是 GET

getUserList(ModelMap map) 方法返回的字符串 userList ,代表着是视图,会有视图解析器解析成为一个具体的视图对象,然后经过视图渲染展示到浏览器

springboot自定义属性

首先项目结构如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

├── pom.xml

└── src

    ├── main

    │   ├── java

    │   │   └── org

    │   │       └── spring

    │   │           └── springboot

    │   │               ├── Application.java

    │   │               └── property

    │   │                   ├── HomeProperties.java

    │   │                   └── UserProperties.java

    │   └── resources

    │       ├── application-dev.properties

    │       ├── application-prod.properties

    │       └── application.properties

    └── test

        ├── java

        │   └── org

        │       └── spring

        │           └── springboot

        │               └── property

        │                   ├── HomeProperties1.java

        │                   └── PropertiesTest.java

        └── resouorces

            └── application.yml

在 application.properties 中对应 HomeProperties 对象字段编写属性的 KV 值:

1

2

3

4

## 家乡属性 Dev

home.province=ZheJiang

home.city=WenLing

home.desc=dev: I'm living in ${home.province} ${home.city}.

这里也可以通过占位符,进行属性之间的引用。

然后,编写对应的 HomeProperties Java 对象:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

/**

 * 家乡属性

 *

 * Created by bysocket on 17/04/2017.

 */

@Component

@ConfigurationProperties(prefix = "home")

public class HomeProperties {

    /**

     * 省份

     */

    private String province;

    /**

     * 城市

     */

    private String city;

    /**

     * 描述

     */

    private String desc;

    public String getProvince() {

        return province;

    }

    public void setProvince(String province) {

        this.province = province;

    }

    public String getCity() {

        return city;

    }

    public void setCity(String city) {

        this.city = city;

    }

    public String getDesc() {

        return desc;

    }

    public void setDesc(String desc) {

        this.desc = desc;

    }

    @Override

    public String toString() {

        return "HomeProperties{" +

                "province='" + province + '\'' +

                ", city='" + city + '\'' +

                ", desc='" + desc + '\'' +

                '}';

    }

}

通过 @ConfigurationProperties(prefix = "home”) 注解,将配置文件中以 home 前缀的属性值自动绑定到对应的字段中。同是用 @Component 作为 Bean 注入到 Spring 容器中。

如果不是用 application.properties 文件,而是用 application.yml 的文件,对应配置如下:

1

2

3

4

5

## 家乡属性

home:

  province: 浙江省

  city: 温岭松门

  desc: 我家住在${home.province}的${home.city}

键值对冒号后面,必须空一格。

注意这里,就有一个坑了:

application.properties 配置中文值的时候,读取出来的属性值会出现乱码问题。但是 application.yml 不会出现乱码问题。原因是,Spring Boot 是以 iso-8859 的编码方式读取 application.properties 配置文件。

注意这里,还有一个坑:

如果定义一个键值对 user.name=xxx ,这里会读取不到对应写的属性值。为什么呢?Spring Boot 的默认 StandardEnvironment 首先将会加载 “systemEnvironment" 作为首个PropertySource. 而 source 即为System.getProperties().当 getProperty时,按照读取顺序,返回 “systemEnvironment" 的值.即 System.getProperty("user.name")

(Mac 机子会读自己的登录账号,这里感谢我的死党 http://rapharino.com/

三、random.* 属性

Spring Boot 通过 RandomValuePropertySource 提供了很多关于随机数的工具类。概括可以生成随机字符串、随机 int 、随机 long、某范围的随机数。

运行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 测试类的 randomTestUser 方法。多次运行,可以发现每次输出不同 User 属性值:

三、random.* 属性

Spring Boot 通过 RandomValuePropertySource 提供了很多关于随机数的工具类。概括可以生成随机字符串、随机 int 、随机 long、某范围的随机数。

运行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 测试类的 randomTestUser 方法。多次运行,可以发现每次输出不同 User 属性值:

1

UserProperties{id=-3135706105861091890, age=41, desc='泥瓦匠叫做3cf8fb2507f64e361f62700bcbd17770', uuid='582bcc01-bb7f-41db-94d5-c22aae186cb4'}

application.yml 方式的配置如下( application.properties 形式这里不写了):

1

2

3

4

5

6

## 随机属性

user:

  id: ${random.long}

  age: ${random.int[1,200]}

  desc: 泥瓦匠叫做${random.value}

  uuid: ${random.uuid}

四、多环境配置

很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。所以看项目结构,有两个环境的配置:

1

2

application-dev.properties:开发环境

application-prod.properties:生产环境

Spring Boot 是通过 application.properties 文件中,设置 spring.profiles.active 属性,比如 ,配置了 dev ,则加载的是 application-dev.properties :

1

2

# Spring Profiles Active

spring.profiles.active=dev

那运行 springboot-properties 工程中 Application 应用启动类,从控制台中可以看出,是加载了 application-dev.properties 的属性输出:

1

HomeProperties{province='ZheJiang', city='WenLing', desc='dev: I'm living in ZheJiang WenLing.'}

将 spring.profiles.active 设置成 prod,重新运行,可得到 application-prod.properties的属性输出:

1

HomeProperties{province='ZheJiang', city='WenLing', desc='prod: I'm living in ZheJiang WenLing.'}

根据优先级,顺便介绍下 jar 运行的方式,通过设置 -Dspring.profiles.active=prod 去指定相应的配置:

1

2

mvn package

java -jar -Dspring.profiles.active=prod springboot-properties-0.0.1-SNAPSHOT.jar

五、小结

常用的样板配置在 Spring Boot 官方文档给出,我们常在 application.properties(或 yml)去配置各种常用配置:

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

 

application.yml 方式的配置如下( application.properties 形式这里不写了):

1

2

3

4

5

6

## 随机属性

user:

  id: ${random.long}

  age: ${random.int[1,200]}

  desc: 泥瓦匠叫做${random.value}

  uuid: ${random.uuid}

@ResponseBody 注解标识该方法的返回值。这样被标注的方法返回值,会直接写入 HTTP 响应体(而不会被视图解析器认为是一个视图对象)。

 

猜你喜欢

转载自blog.csdn.net/weixin_41630573/article/details/83856988