人生苦短,请用Spring Boot

概述

  Spring Boot 是一个轻量级框架,它的的目的是提供一组工具,以便快速构建容易配置的 Spring 应用程序。Spring Boot使用户可以“直接运行”独立的、基于生产级的应用程序。这意味着只需极少的配置,就可以快速获得一个正常运行的 Spring 应用程序。

特性

  1. 为基于 Spring 的应用程序开发提供更快的入门体验
  2. 直接集成Tomcat、Jetty、Undertow等Web容器(不需要部署war包)
  3. 提供了自定义的起步依赖,简化pom.xml配置
  4. 在合理的情况下自动配置Spring和第三方库
  5. 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
  6. 极少的注解配置,绝对不需要XML配置,不需要XML配置,不需要XML配置。重要的事情说三遍。

快速入门

  1. 起步依赖
    创建 Maven 工程 springBootDemo(打包方式 jar),并在pom.xml中添加起步依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
    </parent>
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    </dependencies>

我们会发现以上 jar 包被自动导入了,而这些正是我们开发时需要导入的 jar 包。

  1. 变更 JDK 版本
    添加jdk版本配置,然后更新工程

    1
    2
    3
    <properties>
    <java.version>1.7</java.version>
    </properties>
  2. 引导类
    创建引导类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package com.prchen.demo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @SpringBootApplication
    public class Application {
    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }
    }

执行引导类main方法,控制台出现以下标识:

  1. Spring MVC 实现字符串输出
    用过Spring MVC都知道,使用时需要创建web.xml以及springmvc.xml,并配置前端控制器、处理器映射器、处理器适配器以及视图解析器……但是,用了Spring Boot,这一切繁杂的步骤通通都省了! XML拜拜了您嘞! 我们可以直接写Controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package com.prchen.demo;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class HelloWorldController {
    @RequestMapping("/info")
    public String info() {
    return "Hello Spring Boot!";
    }
    }
  2. 修改 tomcat 启动端口
    在 src/main/resources 下创建 application.properties,配置端口信息server.port=8089,然后重新运行引导类,地址栏输入http://localhost:8089/info 大功告成!

  3. 读取自定义配置
    在 src/main/resources 下的 application.properties 增加配置url=http://www.prchen.com,然后修改Controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RestController
    public class HelloWorldController {

    @Autowired
    private Environment env;

    @RequestMapping("/info")
    public String info() {
    return "Hello Spring Boot!" + env.getProperty("url");
    }
    }

Spring Boot就会读取自定义配置信息并展示

  1. 热部署
    在开发中反复修改类、页面等资源,每次修改后都需要重启才能生效,浪费了大量的时间,能不能在修改代码后不重启就能生效呢?能!Spring Boot在pom.xml 中添加如下依赖就可以实现这样的功能,即热部署。

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    </dependency>

依赖添加后,重启引导类,然后将配置改为url=http://prchen.com,直接刷新页面,配置的更改即时生效了!

在Controller类中添加一个方法,不重启引导类,直接刷新页面。

1
2
3
4
@RequestMapping("/info2")
public String info2() {
return "Hello Spring Boot2!" + env.getProperty("url");
}

你看到了什么?没错,刚刚添加的方法也即时生效了~没错就是这么方便

那么,Spring Boot为什么会这么好用呢?

原理

  1. 关于起步依赖
    jar 包被引入的spring-boot-starter-web 所引用了,所以我们引用 spring-boot-starter-web 后会自动把依赖传递过来。
  2. 关于 @SpringBootApplication 注解
    引导类中 @SpringBootApplication 其实是以下三个注解的总和:
    • @Configuration: 用于定义一个配置类
    • @EnableAutoConfiguration :Spring Boot 会自动根据 jar 包依赖来自动配置目。
    • @ComponentScan: 告诉 Spring 哪个包中用注解标识的类会被自动扫描并装入 bean 容器中。
  3. 自动配置关键注解
    • @Configuration&与@Bean->基于java代码的bean配置
    • @Conditional->设置自动配置条件依赖
    • @EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。
    • @EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。

Spring Boot 整合 ActiveMQ

  1. 使用内嵌服务

    引入ActiveMQ起步依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
    </dependency>

    创建消息生产者

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RestController
    public class QueueController {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @RequestMapping("/send")
    public void send(String text) {
    jmsMessagingTemplate.convertAndSend("prchen", text);
    }
    }

    创建消息消费者

    1
    2
    3
    4
    5
    6
    7
    @Component
    public class Consumer {
    @JmsListener(destination = "prchen")
    public void getMessage(String text) {
    System.out.println("接收到消息:" + text);
    }
    }

    测试:启动服务后,在浏览器执行http://localhost:8089/send?text=abc,控制台输出接收到消息:abc。此时登陆之前配置好的ActiveMQ客户端地址(这里)会发现消息并没有显示,原因是Spring Boot 内置了 ActiveMQ 的服务,所以我们不用单独启动也可以执行应用程序

  2. 使用外部服务

    在 src/main/resources 下的 application.properties 增加配置, 指定 ActiveMQ 的地址(ip为ActiveMQ服务器所在地址)

    1
    spring.activemq.broker-url=tcp://192.168.25.128:61616

    再次发送消息,然后登陆客户端,发现成功接收到消息

  3. 发送 Map 消息

    QueueController中添加sendMap方法

    1
    2
    3
    4
    5
    6
    7
    @RequestMapping("/sendMap")
    public void sendMap() {
    Map map = new HashMap<>();
    map.put("name", "zhangsan");
    map.put("gender", "male");
    jmsMessagingTemplate.convertAndSend("prchen", map);
    }

    Consumer中添加readMapMessage方法

    1
    2
    3
    4
    @JmsListener(destination = "prchen_map")
    public void readMapMessage(Map map) {
    System.out.println("接收到Map:" + map);
    }

    访问http://localhost:8089/sendMap发送消息,访问客户端,发现消息成功接收

扫一扫,关注我的微信公众号↓

0%