1. 简介
Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品。无需开发重量级的 Enterprise JavaBean(EJB),Spring 为企业级Java 开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java 对象(Plain Old Java Object,POJO)实现了 EJB 的功能。
虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring 用 XML 配置,而且是很多 XML 配置。Spring 2.5 引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式 XML 配置。Spring 3.0 引入了基于 Java 的配置,这是一种类型安全的可重构配置方式,可以代替 XML。所有这些配置都代表了开发时的损耗。因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。和所有框架一样,Spring 实用,但与此同时它要求的回报也不少。
除此之外,项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。
Spring Boot 让这一切成为了过去。
Spring Boot 是 Spring 社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于 Spring 的应用程序和服务,让更多人的人更快的对 Spring 进行入门体验,为 Spring 生态系统提供了一种固定的、约定优于配置风格的框架。
1.1 springBoot的特性
1)为基于 Spring 的开发提供更快的入门体验
2)开箱即用,没有代码生成,也无需 XML 配置。同时也可以修改默认值来满足特定的需求。
3)提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
4)Spring Boot 并不是不对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。
2. springBoot的启动依赖
boot工程区别于我们之前是SSM工程,它需要一个启动依赖,配置如下:
<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>
spring-boot-starter-parent:就是父依赖,我们的boot项目必须继承自这个父依赖才能使用启动器。
启动器:启动器就是可以让使用者可以快速添加依赖的工程
web项目启动器:spring-boot-starter-web
如图,添加好启动依赖之后,工程中自动添加了以下这么多的jar包
3. 变更JDK版本
maven项目默认的JDK版本是1.5,boot的默认版本是1.6,我们要是想更改jdk的版本了,该怎么做了?在boot中有两种方式,一种是跟之前一样添加插件,还有一种就是使用properties属性标签来配置,例如:
<properties>
<java.version>1.7</java.version>
</properties>
4. 引导类
boot项目不需要web容器(tomcat),是因为其内置了web容器的,但是,既然没有容器,我们需要有入口来运行我们的程序,在boot中是通过引导类(启动类)来完成的,该类是整个应用的一个入口。
该类用注解@SpringBootApplication来标识,main函数就是应用的入口。在main函数中通过执行静态类SpringApplication的run方法来启动应用程序,例如:
package com.bjc.boot.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);
}
}
注意:@SpringBootApplication其实就是以下三个注解的总和
1)@Configuration: 用于定义一个配置类
2)@EnableAutoConfiguration :Spring Boot会自动根据你jar包的依赖来自动配置项目。该配置很重要,会让工程的所有配置都按照默认配置来运行,这样我们就可以更多的关注业务代码本身了,当然,如果默认配置不能满足我们的需求的时候,我们可以通过属性文件来修改配置。
3)@ComponentScan: 告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。所以,引导内一般位于根包下,这样可以扫描更多的类。
在引导类中,我们还可以配置一些javabean配置对象。
5. Demo开发
经过以上的配置,已经可以做boot的开发了,我们实现一个Hello world的程序
1)控制层
package com.bjc.boot.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/boot")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hellow world!";
}
}
测试:
6. 读取配置文件
在boot中,要读取properties文件中的key和value相当简单
例如:在application.properties定义url
在代码中只需要使用如下代码即可
测试结果如图;
7. 热部署依赖
我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,能不能在我修改代码后不重启就能生效呢?可以,在pom.xml中添加如下配置就可以实现这样的功能,我们称之为热部署
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
8. SpringBoot与ActiveMQ整合
8.1 启动器
<!-- 添加activeMQ依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
8.2 使用内置的ActiveMQ
使用你内置的ActiveMQ很简单,直接引入jmsMessagingTemplate就可以使用了,无需配置文件
8.2.1 生产者
package com.bjc.boot.demo;
import javax.annotation.Resource;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/producer")
public class QueueProducer {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
@RequestMapping("/send")
public void sendMesg(String text){
jmsMessagingTemplate.convertAndSend("bjc", text);
}
}
直接调用jmsMessagingTemplate的convertAndSend方法即可发送消息了,第一个参数是消息名称,第二个参数是消息内容
8.2.2 消费者
package com.bjc.boot.demo;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class QueueConsumer {
@JmsListener(destination = "bjc")
public void receive(String text){
System.out.println("接收到的消息是:" + text);
}
}
消费者也很简单,无需我们单独写监听器了,也不需要配置文件了,直接用注解@JmsListener,属性值为消息的名称,定义的接收方法的参数就是消息。
8.3 使用外部服务
使用外部服务也超级简单,只需要在src/main/resources下的application.properties增加配置, 指定ActiveMQ的地址
例如:
spring.activemq.broker-url=tcp://192.168.25.130:61616
这样配置就好了
8.4 发送Map信息
和发送文本消息方式一样,不同的是,在监听方法的参数上要写Map类型的形参数
8.4.1 生产者
@RequestMapping("/sendMap")
public void sendMapMesg(){
Map map = new HashMap();
map.put("name", "张三");
map.put("age", 22);
map.put("birth", "2019-01-02");
jmsMessagingTemplate.convertAndSend("bjcMap", map);
}
8.4.2 消费者
@JmsListener(destination = "bjcMap")
public void receiveMap(Map map){
System.out.println("接收到的消息是:" + map);
}
我们发现使用boot整合activeMQ只需要注意三个地方就可以了
1)生产者发送的消息名称与消费者监听注解的名称要一致
2)消费者的监听方法要加注解@JmsListener
3)消费者监听方法的参数类型与消息类型要一致