Spring Boot 2精髓 - (1) JavaEE简介

spring boot

Java EE

Java EE 架构

Java EE 是一种企业应用的软件架构 。

作为企业应用或者互联网应用的架构, 总有如下功能需求, JavaEE有相应的规范实现与之 对应 。

  • Web 支持 : 企业应用、互联网应用越来越多的是基于 B/S 的结构, Java EE 对应的有Serviet规范,规定了 Web 容器Serviet 组件 , 还设有 JSP&JSTL 处理动态页面 。

  • 事务支持: 提供事务管理器,支持管理事务,如单一数据库、 多个数据库,以及数据 库和其他资源的事务协作等。 Java EE里提供了 JTA事务 APIJTS事务服务规范。 事务支持也实现了分布式事务管理, 管理多个数据库或者支持事务的资源。

  • 消息服务: 企业各个系统、 系统模块之间通过消息服务进行并步交互, JavaEE提供了 JMS 服务 , 用于系统间可 靠 的消息交互 。

  • 数据库持久层: JavaEE先有 EJB规范, 后来又提出了更有实际操作性的 JPA, 这些都 是企业访 问数据库常用的方法 。

  • Container: 提供了 WebContainer, 用于实现 Serviet,以及 EJB Container,实现 EJB, Container用于管理这些组件,并提供组件需要的服务, 比如 JTS、 JMS等。

其他技术还包括如下所述 的内容:

  • JWS: 这也是分布式系统交互的一种方式, 是 Java实现的一种 WebService。

  • JAX-RS: Java EE 6 引入的新技术,通过 阻 ST 进行交互 。

  • JNDI: 查找服务和对象的接口,如查找一个配置好的数据源。

  • JAXP/JAXB: XML流行的时候,解析和绑定JavaBean的XML工具。

  • JAX-RPC:分布式系统交互的一种方式,通过 RPC 方式调用 。

  • JACC: 安全认证。

  • Java EE Application Server:提供了上述所有服务的 Web 服务器,我们常用的 Tomcat、 Resin, 只能算是 Java EE Web 服务器,开源的 JBoss、商业的 weblogic 等称为应用服 务器。

Java EE 的缺点

  • 过于复杂: JavaEE针对的是复杂的分布式企业应用,然而现实情况是大部分应用都比较简单,复杂的架构带来了复杂的开发方式和部署方式(早期的 Java EE 普通系统打包部署都需要数十分钟) 。

  • 追求分布式:大部分应用并非都是 Java EE 假定的分布式系统,像 EJB、 JMS、 JWS 等技术实现门槛又高又容易出错。 Spring 曾经反对过这种分布式架构,井只提供了容 器管理,因此获得了巨大成功。 大型应用采用分布式架构不可避免, Spring 提供了其 他的技术支持,比如支持阻 RESTFul 架构 。

  • 不能及时与流行开源技术结合 :比如消息处理,除了有标准的 JMS 支持,现在还有性能更好的 RabbitMQ 和 Kafkao Java EE 并没有与之相应的标准,反而是Spring,具有统一的实现消息处理模式,无论用的是JMS、RabbitMQ,还是性能更好的 Kafka,都能快速上手。

  • Java EE 应用服务器通常由商业公司提供,价格不菲,少有公司采用。管理应用服务器和部署应用对初学者和自学者有一定门槛 。

Spring

Spring 是为了解决应用复杂性而产生的框架

Spring 只提供了两种机制,控制反转(IoC)面向切面(AOP),来提供任意的服务和增强 Bean 的任意特性,使得 Spring 本身容易掌握,又可以通过 Bean 管理来无限扩展功能 。

SpringloC容器和AOP

loC Core Container: Spring Container 负责管理你的任意对象,并结合你对对象的描述进行初始化和加强。

比如,对于 一个用注解@Controller 声明的对象, Spring 会认为这个对象是个 Web Controller,如果这个对象里的方法有@RequestMapping注解,则会将客户端发起的 HTTP 请求转化成 Java方法调用 。

如常见的@Service 注解对象,通常用来处理业务逻辑 , Spring Container往往会增强这类对象的事务控制能力 。

容器管理还可以 为被管理的Bean 提供其他被管理和被增强的Bean.

AOP: 面向切面编程,通过预编译方式或者运行时刻对目标对象动态地添加功能。

AOP 分离了 企业应用的业务逻辑系统级服务,比如事务服务,还有应用系统的审计、安全访问等代码。

Spring 的缺点

  • 使用门槛升高,要入门Spring需要较长时间。

  • 对过时技术兼容,导致使用复杂度升高。

  • XML 配置已经不是流行的系统配置方式。

  • 集成第三方工具时候,程序员还要考虑工具之间的兼容性。

  • 系统启动慢,不具备热部署功能,完全依赖虚拟机或者 Web 服务器的热部署。

Spring Boot

Spring Boot 管理 Spring容器、第三方插件,并提供很多默认系统级的服务。

Spring Boot提供的常用 Starter:

名称 作用
spring-boot-starter-web Web开发支持, 默认使用 Tomcat8
spring-boot-starter-aop AOP开发支持,使用 AspectJ
spring-boot-starter-jdbc Spring JDBC
spring-boot-starter-data-jpa JPA 方式访问数据库,使用Hibernate 作为JPA实现
spring-boot-starter-data-elasticsearch 集成Elasticsearch, 默认访问 localhost:9200
spring-boot-starter-data-redis 集成Redis, 使用JRedis,默认连接 localhost:6379
spring-boot-starter-cache 缓存,支持多种缓存方式 ,如本地的、Redis、Ehcache 等
spring-boot-devtools 应用程序快速重启的工具 ,提升开发体验
spring-boot-starter-data-mongodb 集成Mongodb,默认访问 mongodb://localhos/test
spring-boot-starter-data-neo4j 集成neo4j,默认访问 localhos:7474
spring-boot-starter-data-gemfire 集成分布式缓存
spring-boot-starter-data-solr 基于 Apache lucene 的搜索平台 ,默认访问 http://localhost:8983/solr
spring-boot-starter-data-cassandra 集成 Cassandra,默认访问 localhost:7474
spring-boot-sta此er-data-ldap 集成 ldap
spring-boot-starter-activemq 消息集成 ActiveMQ 支持
spring-boot-starter-amqp 消息集成AMQP协议支持,如支持 RabbitMQ
spring-boot-starter-jta-atomikos 分布式事务支持,使用atomikos
spring-boot-starter-jta-bitronix 一个开源的分布式事务支持
spring-boot-starter-test 包含 JUnit、 SpringTest、 Hamcrest、 Mockito 等测试工具
spring-boot-starter-webservices webservice 支持
spring-boot-starter-websocket websocket支持
spring-boot-starter-jersey REST 应用和 Jersey 支持
spring-boot-starter-freemarker Freemaker支持

优点 :

  • 实现约定大于配置,是一个低配置的应用系统框架。不像 Spring那样地狱般的配置体验,Spring Boot 不需要配置或者极少配置,就能使用 Spring 大量的功能。
  • 提供了内置的 Tomcat 或者 Jetty 容器。
  • 通过依赖的 jar包管理、自动装配技术,容易支持与其他技术体系、工具集成。
  • 支持热加载,开发体验好。也支持 Spring Boot 系统监控,方便了解系统运行状况。

Hello, Spring Boot

创建Maven工程 —— pom.xml文件

Web支持 —— spring-boot-starter-web

spring-boot-dependencies 默认会使用内置的 Tomcat,井支持 Spring MVC、 RESSTFul 服务。

pom.xml:

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
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bee.sample</groupId>
<artifactId>ch1.helloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<!-- 为web应用程序添加典型的依赖项 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

<!-- 作为可执行jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>

示例代码

Ch1Application.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.bee.sample.ch1;

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

@SpringBootApplication
public class Ch1Application {

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

}

HelloworldController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.bee.sample.ch1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bee.sample.ch1.annotation.Function;

@Controller
public class HelloworldController {

@RequestMapping("/sayhello.html")
@Function()
public @ResponseBody String say(String name){
return "hello "+name;
}
}

启动 ChlApplication 程序, 打开浏览器,访问地址 http://127.0.0.1:8080/say.html,可以看到输出了“ Hello Spring Boot”。

使用热部署

spring-boot-devtools, 它能在修改类或者配置文件的时候自动重新加载 Spring Boot 应用

支持REST

UserReditRestController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.bee.sample.ch1.rest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* 注解RestController相当于注解Controller和ResponseBody的合体。
* 试试诡异制造如下问题:
* 1 更改getCreditLevel名字为getCreditLevelTest
* 2 /usercredit/{id} 更改为 /usercredit/{id1}
*
*/
@RestController
public class UserReditRestController {

@RequestMapping(value="/usercredit/{id}")
public Integer getCreditLevel(@PathVariable String id) {
return Integer.parseInt(id);
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :