Java EE
Java EE 架构
Java EE 是一种企业应用的软件架构 。
作为企业应用或者互联网应用的架构, 总有如下功能需求, JavaEE有相应的规范实现与之 对应 。
Web 支持 : 企业应用、互联网应用越来越多的是基于
B/S
的结构, Java EE 对应的有Serviet
规范,规定了Web 容器
、Serviet 组件
, 还设有JSP&JSTL
处理动态页面 。事务支持: 提供
事务管理器
,支持管理事务,如单一数据库、 多个数据库,以及数据 库和其他资源的事务协作等。 Java EE里提供了JTA事务 API
和JTS事务服务
规范。 事务支持也实现了分布式事务管理, 管理多个数据库或者支持事务的资源。消息服务: 企业各个系统、 系统模块之间通过消息服务进行并步交互, 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 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
示例代码
Ch1Application.java
1 | package com.bee.sample.ch1; |
HelloworldController.java
1 | package com.bee.sample.ch1.controller; |
启动 ChlApplication 程序, 打开浏览器,访问地址 http://127.0.0.1:8080/say.html
,可以看到输出了“ Hello Spring Boot”。
使用热部署
spring-boot-devtools
, 它能在修改类或者配置文件的时候自动重新加载 Spring Boot 应用
支持REST
UserReditRestController.java
1 | package com.bee.sample.ch1.rest; |