概述
Spring Boot 是一个轻量级框架,它的的目的是提供一组工具,以便快速构建容易配置的 Spring 应用程序。Spring Boot使用户可以“直接运行”独立的、基于生产级的应用程序。这意味着只需极少的配置,就可以快速获得一个正常运行的 Spring 应用程序。
特性
- 为基于 Spring 的应用程序开发提供更快的入门体验
- 直接集成Tomcat、Jetty、Undertow等Web容器(不需要部署war包)
- 提供了自定义的起步依赖,简化pom.xml配置
- 在合理的情况下自动配置Spring和第三方库
- 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
- 极少的注解配置,绝对不需要XML配置,不需要XML配置,不需要XML配置。重要的事情说三遍。
快速入门
- 起步依赖
创建 Maven 工程 springBootDemo(打包方式 jar),并在pom.xml中添加起步依赖
<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 包。
-
变更 JDK 版本
添加jdk版本配置,然后更新工程<properties> <java.version>1.7</java.version> </properties>
-
引导类
创建引导类
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方法,控制台出现以下标识:
- Spring MVC 实现字符串输出
用过Spring MVC都知道,使用时需要创建web.xml以及springmvc.xml,并配置前端控制器、处理器映射器、处理器适配器以及视图解析器……但是,用了Spring Boot,这一切繁杂的步骤通通都省了!XML拜拜了您嘞!我们可以直接写Controller
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!";
}
}
-
修改 tomcat 启动端口
在 src/main/resources 下创建 application.properties,配置端口信息server.port=8089
,然后重新运行引导类,地址栏输入http://localhost:8089/info 大功告成!
-
读取自定义配置
在 src/main/resources 下的 application.properties 增加配置url=http://www.prchen.com
,然后修改Controller
@RestController
public class HelloWorldController {
@Autowired
private Environment env;
@RequestMapping("/info")
public String info() {
return "Hello Spring Boot!" + env.getProperty("url");
}
}
Spring Boot就会读取自定义配置信息并展示
- 热部署
在开发中反复修改类、页面等资源,每次修改后都需要重启才能生效,浪费了大量的时间,能不能在修改代码后不重启就能生效呢?能!Spring Boot在pom.xml 中添加如下依赖就可以实现这样的功能,即热部署。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
依赖添加后,重启引导类,然后将配置改为url=http://prchen.com
,直接刷新页面,配置的更改即时生效了!
在Controller类中添加一个方法,不重启引导类,直接刷新页面。
@RequestMapping("/info2")
public String info2() {
return "Hello Spring Boot2!" + env.getProperty("url");
}
你看到了什么?没错,刚刚添加的方法也即时生效了~没错就是这么方便
那么,Spring Boot为什么会这么好用呢?
原理
- 关于起步依赖
jar 包被引入的spring-boot-starter-web 所引用了,所以我们引用 spring-boot-starter-web 后会自动把依赖传递过来。 - 关于 @SpringBootApplication 注解
引导类中 @SpringBootApplication 其实是以下三个注解的总和:- @Configuration: 用于定义一个配置类
- @EnableAutoConfiguration :Spring Boot 会自动根据 jar 包依赖来自动配置目。
- @ComponentScan: 告诉 Spring 哪个包中用注解标识的类会被自动扫描并装入 bean 容器中。
- 自动配置关键注解
- @Configuration&与@Bean->基于java代码的bean配置
- @Conditional->设置自动配置条件依赖
- @EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。
- @EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。
Spring Boot 整合 ActiveMQ
-
使用内嵌服务
引入ActiveMQ起步依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
创建消息生产者
@RestController public class QueueController { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @RequestMapping("/send") public void send(String text) { jmsMessagingTemplate.convertAndSend("prchen", text); } }
创建消息消费者
@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 的服务,所以我们不用单独启动也可以执行应用程序 -
使用外部服务
在 src/main/resources 下的 application.properties 增加配置, 指定 ActiveMQ 的地址(ip为ActiveMQ服务器所在地址)
spring.activemq.broker-url=tcp://192.168.25.128:61616
再次发送消息,然后登陆客户端,发现成功接收到消息
-
发送 Map 消息
QueueController中添加sendMap方法
@RequestMapping("/sendMap") public void sendMap() { Map map = new HashMap<>(); map.put("name", "zhangsan"); map.put("gender", "male"); jmsMessagingTemplate.convertAndSend("prchen", map); }
Consumer中添加readMapMessage方法
@JmsListener(destination = "prchen_map") public void readMapMessage(Map map) { System.out.println("接收到Map:" + map); }
访问
http://localhost:8089/sendMap
发送消息,访问客户端,发现消息成功接收