1. EJB
1.1. 背景
功能日趨復(fù)雜的軟件,如果把所有的功能實(shí)現(xiàn)都放在客戶(hù)端,不僅代碼沒(méi)有安全性,部署及發(fā)布運(yùn)維都會(huì)變的很復(fù)雜,所以將軟件的功能實(shí)現(xiàn)分為客戶(hù)端和服務(wù)端,服務(wù)端和客戶(hù)端之間通過(guò)網(wǎng)絡(luò)調(diào)用進(jìn)行功能實(shí)現(xiàn)。
客戶(hù)端只做界面展示和數(shù)據(jù)交互,功能的實(shí)現(xiàn)統(tǒng)統(tǒng)交給服務(wù)端去做,但這不是前后端分離的意思,而是部署及功能實(shí)現(xiàn)的問(wèn)題。
整個(gè)的這個(gè)實(shí)現(xiàn)方案對(duì)應(yīng)的技術(shù)就是Java EE(Java Platform,Enterprise Edition),JavaEE提供了廣泛的企業(yè)級(jí)特性和服務(wù),由Sun公司為企業(yè)級(jí)應(yīng)用推出的標(biāo)準(zhǔn)平臺(tái),也可以說(shuō)是一種開(kāi)發(fā)思路或者模范。包含了我們現(xiàn)在java開(kāi)發(fā)的眾多標(biāo)準(zhǔn)技術(shù)-13項(xiàng)核心技術(shù)規(guī)范
- JDBC(Java Database Connectivity):Java數(shù)據(jù)庫(kù)連接。
- JNDI(Java Naming and Directory Interface):Java的命名和目錄接口。
- EJB(Enterprise JavaBean):企業(yè)級(jí)JavaBean。(早已被spring替代了)
- RMI(Remote Method Invoke):遠(yuǎn)程方法調(diào)用。
- Java IDL(Interface Description Language)/ CORBA(Common Object Broker Architecture):接口定義語(yǔ)言/公用對(duì)象請(qǐng)求代理程序體系結(jié)構(gòu)。
- JSP(Java Server Pages):Java服務(wù)端頁(yè)面,一種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)標(biāo)準(zhǔn)。
- Sevlet(Server Applet):Java服務(wù)端程序。
- XML(Extensible Markup Language):可擴(kuò)展標(biāo)記語(yǔ)言。
- JMS(Java Messages Service):Java消息服務(wù)。
- JTA(Java Transaction API):Java事務(wù)API。
- JTS(Java Transaction Service):Java事務(wù)服務(wù)。
- JavaMail:Java處理電子郵件的相關(guān)接口。
- JAF(JavaBean Activation Framework):數(shù)據(jù)處理框架。
在JavaEE的開(kāi)發(fā)思路下,整個(gè)軟件實(shí)現(xiàn)就會(huì)分為三層:
- 視圖層或表現(xiàn)層:提供用戶(hù)界面,接收用戶(hù)輸入,數(shù)據(jù)輸出。Web應(yīng)用的情況,JSP以及Servlet屬于視圖層組件。
- 業(yè)務(wù)邏輯層:實(shí)際的業(yè)務(wù)邏輯處理。根據(jù)視圖層傳送過(guò)來(lái)的數(shù)據(jù),進(jìn)行實(shí)際的業(yè)務(wù)邏輯處理(包括數(shù)據(jù)庫(kù)的查詢(xún),更新等),再把處理后的結(jié)果返回給視圖層。EJB,以及不使用EJB的情況下?lián)?dāng)業(yè)務(wù)邏輯處理部分的JavaBean等歸屬于業(yè)務(wù)邏輯層組件。
- 數(shù)據(jù)持久化層:多指用于保存業(yè)務(wù)數(shù)據(jù)的數(shù)據(jù)庫(kù),也可以是文件等。
商務(wù)軟件的核心部分是它的業(yè)務(wù)邏輯。業(yè)務(wù)邏輯抽象了整個(gè)商務(wù)過(guò)程的流程,并使用計(jì)算機(jī)語(yǔ)言將他們實(shí)現(xiàn)。J2EE 對(duì)于這個(gè)問(wèn)題的處理方法是將業(yè)務(wù)邏輯從客戶(hù)端軟件中抽取出來(lái),封裝在一個(gè)組件中。這個(gè)組件運(yùn)行在一個(gè)獨(dú)立的服務(wù)器上,客戶(hù)端軟件通過(guò)網(wǎng)絡(luò)調(diào)用組件提供的服務(wù)以實(shí)現(xiàn)業(yè)務(wù)邏輯,而客戶(hù)端軟件的功能單純到只負(fù)責(zé)發(fā)送調(diào)用請(qǐng)求和顯示處理結(jié)果。在J2EE 中, 這個(gè)運(yùn)行在一個(gè)獨(dú)立的服務(wù)器上,并封裝了業(yè)務(wù)邏輯的組件就是EJB(Enterprise Java Bean)組件。所以EJB是屬于J2EE(Java EE)體系結(jié)構(gòu)中的業(yè)務(wù)邏輯層部分。
題外話(huà):Java剛開(kāi)始的時(shí)候,因?yàn)楦鞣N應(yīng)用和生態(tài)不成熟,很多東西需要有人牽頭制定強(qiáng)制規(guī)范引導(dǎo)Java的發(fā)展,于是JavaEE曾經(jīng)引領(lǐng)了企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)。但隨著時(shí)代的進(jìn)步越來(lái)越多的公司和組織參與到Java世界,出現(xiàn)了各種各樣的JavaEE組件的代替者,比如Hibernate、Spring就是其中兩個(gè)典型。相反,Java官方制定的各種JavaEE規(guī)范反而不太受歡迎,他們制定了JSF規(guī)范,但實(shí)際企業(yè)開(kāi)發(fā)喜歡用Struts 2、Spring MVC;他們制定了EJB規(guī)范,但實(shí)際企業(yè)開(kāi)發(fā)還是喜歡用Spring;他們制定了JPA規(guī)范,但實(shí)際企業(yè)開(kāi)發(fā)往往還是喜歡直接用Hibernate、MyBatis?,F(xiàn)代企業(yè)級(jí)應(yīng)用常用的各種框架和工具,比如Struts 2、Spring、Hibernate、jBPM、Activiti、Lucene、Hadoop、Drools、CXF等這些大家耳熟能詳?shù)慕M件,全部都不是來(lái)自O(shè)racle官方,但是卻在企業(yè)應(yīng)用中開(kāi)發(fā)經(jīng)常用到的。現(xiàn)在企業(yè)里面,真正常用的JavaEE規(guī)范有什么?Servlet、JSP、JMS、JNDI。這些技術(shù)都只是充當(dāng)了一個(gè)程序的入口而已。
1.2. 詳解
以上是EJB出現(xiàn)的原因,現(xiàn)在還需要詳細(xì)看看EJB實(shí)現(xiàn)的功能,EJB組件運(yùn)行在EJB容器之中,EJB容器是一個(gè)EJB引擎,它提供了EJB組件運(yùn)行的環(huán)境,并對(duì)EJB組件進(jìn)行管理。EJB容器一般包含在EJB服務(wù)器(或應(yīng)用服務(wù)器)中,EJB服務(wù)器可以擁有一到多個(gè)EJB容器。比較有名的支持EJB的服務(wù)器有Sun One,Interstage,Websphere,Weblogic,JBoss,JRun等。
調(diào)用EJB組件的一方被稱(chēng)為EJB客戶(hù)端。EJB客戶(hù)端可以為運(yùn)行在WEB容器中的JSP,SERVLET;或者一般的Java Application,Applet;或者Web Service;也可以是別的EJB組件。
EJB客戶(hù)端與EJB服務(wù)器可處于同一JVM環(huán)境中,也可處于不同計(jì)算機(jī)的不同JVM環(huán)境。
EJB提供了一種簡(jiǎn)化復(fù)雜性的機(jī)制,使開(kāi)發(fā)人員可以關(guān)注業(yè)務(wù)邏輯,而不是底層的復(fù)雜性,例如事務(wù)管理,安全性,遠(yuǎn)程訪(fǎng)問(wèn)等。
1.2.1. EJB的存在原因
- 簡(jiǎn)化開(kāi)發(fā):EJB將復(fù)雜的事務(wù)和安全管理交給了服務(wù)器,使開(kāi)發(fā)人員能夠?qū)W⒂陂_(kāi)發(fā)業(yè)務(wù)邏輯。
- 標(biāo)準(zhǔn)化:EJB提供了一種標(biāo)準(zhǔn)化的方式來(lái)開(kāi)發(fā)分布式應(yīng)用,這使得不同的開(kāi)發(fā)者和團(tuán)隊(duì)之間的協(xié)作變得更加簡(jiǎn)單。
- 可移植性:由于EJB是基于Java EE規(guī)范的,所以EJB應(yīng)用程序可以在任何符合Java EE規(guī)范的服務(wù)器上運(yùn)行,這增加了應(yīng)用的可移植性。
1.2.2. EJB解決的問(wèn)題
- 事務(wù)管理:EJB容器自動(dòng)處理了事務(wù)的開(kāi)始、提交和回滾,開(kāi)發(fā)者不必自己編寫(xiě)這些代碼。
- 安全性:EJB容器可以處理用戶(hù)的認(rèn)證和授權(quán),為應(yīng)用程序提供安全性保障。
- 并發(fā)處理:EJB容器能夠管理并發(fā)訪(fǎng)問(wèn),為開(kāi)發(fā)者處理多線(xiàn)程問(wèn)題。
- 分布式計(jì)算:EJB容器提供了遠(yuǎn)程方法調(diào)用(RMI)的支持,使得在分布式環(huán)境中進(jìn)行通信變得簡(jiǎn)單。
- 生命周期管理:EJB容器負(fù)責(zé)EJB對(duì)象的創(chuàng)建和銷(xiāo)毀,開(kāi)發(fā)者不必關(guān)心這些底層的細(xì)節(jié)。
1.2.3. EJB的基本組成部分:
- 會(huì)話(huà)Bean(Session Beans):會(huì)話(huà)Bean用于執(zhí)行服務(wù)器上的業(yè)務(wù)邏輯,它可以是有狀態(tài)的(Stateful),也可以是無(wú)狀態(tài)的(Stateless)。
- 實(shí)體Bean(Entity Beans):實(shí)體Bean用于封裝在數(shù)據(jù)庫(kù)中存儲(chǔ)的業(yè)務(wù)對(duì)象的數(shù)據(jù)和業(yè)務(wù)邏輯。實(shí)體Bean在EJB 3.0之后被JPA(Java Persistence API)取代。
- 消息驅(qū)動(dòng)Bean(Message-Driven Beans):消息驅(qū)動(dòng)Bean用于異步處理由JMS(Java Message Service)發(fā)送的消息。
1.3. 示例
Session Beans是EJB的一種類(lèi)型,主要用于執(zhí)行業(yè)務(wù)邏輯。它們不直接代表數(shù)據(jù)庫(kù)中的數(shù)據(jù),而是封裝了一組業(yè)務(wù)操作,這些操作可以被客戶(hù)端程序調(diào)用。Session Beans有兩種類(lèi)型:無(wú)狀態(tài)(Stateless)和有狀態(tài)(Stateful)。
-
無(wú)狀態(tài)會(huì)話(huà)Bean(Stateless Session Beans):不保持任何客戶(hù)端特定的會(huì)話(huà)狀態(tài)。當(dāng)一個(gè)方法調(diào)用完成后不會(huì)保留任何關(guān)于客戶(hù)端的信息。這意味著你可以在多個(gè)客戶(hù)端之間共享一個(gè)無(wú)狀態(tài)Bean的實(shí)例,因?yàn)樗痪S護(hù)任何關(guān)于客戶(hù)端的狀態(tài)信息。它的一個(gè)主要優(yōu)點(diǎn)是它們可以被高效地池化和復(fù)用,可以處理大量的請(qǐng)求,而不需要為每個(gè)客戶(hù)端創(chuàng)建一個(gè)新的Bean實(shí)例。
-
有狀態(tài)會(huì)話(huà)Bean(Stateful Session Beans):會(huì)保持與特定客戶(hù)端相關(guān)的會(huì)話(huà)狀態(tài)。這個(gè)狀態(tài)會(huì)在客戶(hù)端和Bean之間的多個(gè)方法調(diào)用之間保持,并在會(huì)話(huà)結(jié)束時(shí)被銷(xiāo)毀。它的一個(gè)主要優(yōu)點(diǎn)是它們可以保存客戶(hù)端的狀態(tài),這使得它們非常適合在需要維護(hù)會(huì)話(huà)狀態(tài)的應(yīng)用中使用。例如,如果你正在開(kāi)發(fā)一個(gè)在線(xiàn)購(gòu)物應(yīng)用,你可能需要一個(gè)有狀態(tài)Bean來(lái)保存用戶(hù)的購(gòu)物車(chē)信息。然而,有狀態(tài)Bean的一個(gè)主要缺點(diǎn)是它們不能被共享和復(fù)用,因?yàn)樗鼈儽4媪丝蛻?hù)端特定的狀態(tài)。這意味著如果有大量的客戶(hù)端,你可能需要?jiǎng)?chuàng)建大量的有狀態(tài)Bean實(shí)例,這可能會(huì)消耗大量的資源。
項(xiàng)目目錄樹(shù)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>EJBAnHour</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0</version>
</dependency>
</dependencies>
<build>
<finalName>EJBAnHour</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
Hello2Servlet.java
package org.example;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.Logger;
@WebServlet("/hello2")
public class Hello2Servlet extends HttpServlet {
private static final Logger LOGGER = Logger.getLogger(Hello2Servlet.class.getName());
public Hello2Servlet() {
LOGGER.info("Hello2Servlet is created");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
LOGGER.info("doGet method is called");
resp.getWriter().write("Hello from Hello2Servlet!");
}
}
HelloEJB.java
package org.example;
import javax.ejb.Stateless;
@Stateless
public class HelloEJB {
public String sayHello() {
return "Hello, EJB!";
}
}
HelloServlet.java
package org.example;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@EJB
private HelloEJB helloEJB;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write(helloEJB.sayHello());
}
}
運(yùn)行結(jié)果
1.4. 總結(jié)
- EJB實(shí)現(xiàn)原理: 就是把原來(lái)放到客戶(hù)端實(shí)現(xiàn)的代碼放到服務(wù)器端,并依靠RMI進(jìn)行通信。
- RMI實(shí)現(xiàn)原理 :就是通過(guò)Java對(duì)象可序列化機(jī)制實(shí)現(xiàn)分布計(jì)算。
- 服務(wù)器集群: 就是通過(guò)RMI的通信,連接不同功能模塊的服務(wù)器,以實(shí)現(xiàn)一個(gè)完整的功能。
2. Spring
2.1. Spring Framework
早期的 J2EE(Java EE 平臺(tái))推崇以 EJB 為核心的開(kāi)發(fā)方式,但這種開(kāi)發(fā)方式在實(shí)際的開(kāi)發(fā)過(guò)程中存在種種弊端,例如使用復(fù)雜、代碼臃腫、代碼侵入性強(qiáng)、開(kāi)發(fā)周期長(zhǎng)、移植難度大等。
Rod Johnson 在其 2004 年編著的暢銷(xiāo)書(shū)《Expert One-on-One J2EE Development without EJB》中,針對(duì) EJB 各種臃腫的結(jié)構(gòu)進(jìn)行了逐一的分析和否定,并分別以更加簡(jiǎn)潔的方式進(jìn)行了替換。這本書(shū)影響甚遠(yuǎn),后來(lái) Rod Johnson 將 com.interface21 的代碼開(kāi)源,并把這個(gè)新框架并命名為“Spring”,含義為:Spring 像一縷春風(fēng)一樣,掃平傳統(tǒng) J2EE 的寒冬。
- 廣義spring:以 Spring Framework 為核心的 Spring 技術(shù)棧,經(jīng)過(guò)十多年的發(fā)展,Spring 已經(jīng)不再是一個(gè)單純的應(yīng)用框架,而是逐漸發(fā)展成為一個(gè)由多個(gè)不同子項(xiàng)目(模塊)組成的成熟技術(shù),例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子項(xiàng)目的基礎(chǔ)。
- 狹義spring:特指Spring Framework,通常我們將它稱(chēng)為 Spring 框架
Spring 框架是一個(gè)分層的、面向切面的 Java 應(yīng)用程序的一站式輕量級(jí)解決方案,它是 Spring 技術(shù)棧的核心和基礎(chǔ),是為了解決企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring 有兩個(gè)核心部分: IoC 和 AOP。
- IOC:Inverse of Control 的簡(jiǎn)寫(xiě),譯為“控制反轉(zhuǎn)”,指把創(chuàng)建對(duì)象過(guò)程交給 Spring 進(jìn)行管理。
- AOP:Aspect Oriented Programming 的簡(jiǎn)寫(xiě),譯為“面向切面編程”。 AOP 用來(lái)封裝多個(gè)類(lèi)的公共行為,將那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯封裝起來(lái),減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度。另外,AOP 還解決一些系統(tǒng)層面上的問(wèn)題,比如日志、事務(wù)、權(quán)限等。
spring框架的特點(diǎn):
-
方便解耦,簡(jiǎn)化開(kāi)發(fā)
Spring 就是一個(gè)大工廠,可以將所有對(duì)象的創(chuàng)建和依賴(lài)關(guān)系的維護(hù)交給 Spring 管理。 -
方便集成各種優(yōu)秀框架
Spring 不排斥各種優(yōu)秀的開(kāi)源框架,其內(nèi)部提供了對(duì)各種優(yōu)秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。 -
降低 Java EE API 的使用難度
Spring 對(duì) Java EE 開(kāi)發(fā)中非常難用的一些 API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等)都提供了封裝,使這些 API 應(yīng)用的難度大大降低。 -
方便程序的測(cè)試
Spring 支持 JUnit4,可以通過(guò)注解方便地測(cè)試 Spring 程序。 -
AOP 編程的支持
Spring 提供面向切面編程,可以方便地實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截和運(yùn)行監(jiān)控等功能。 -
聲明式事務(wù)的支持
只需要通過(guò)配置就可以完成對(duì)事務(wù)的管理,而無(wú)須手動(dòng)編程。
4 個(gè) jar 文件是 Spring 框架的基礎(chǔ)包,分別對(duì)應(yīng) Spring 容器的四個(gè)模塊:
- spring-core-x.x.xx.jar 包含 Spring 框架基本的核心工具類(lèi),Spring 其他組件都要用到這個(gè)包中的類(lèi),是其他組件的基本核心。
- spring-beans-x.x.xx.jar 所有應(yīng)用都要用到的,它包含訪(fǎng)問(wèn)配置文件、創(chuàng)建和管理 Bean 以及進(jìn)行 Inversion of Control(IoC)或者 Dependency Injection(DI)操作相關(guān)的所有類(lèi)。
- spring-context-x.x.xx.jar Spring 提供在基礎(chǔ) IoC 功能上的擴(kuò)展服務(wù),此外還提供許多企業(yè)級(jí)服務(wù)的支持,如郵件服務(wù)、任務(wù)調(diào)度、JNDI 定位、EJB 集成、遠(yuǎn)程訪(fǎng)問(wèn)、緩存以及各種視圖層框架的封裝等。
- spring-expression-x.x.xx.jar 定義了 Spring 的表達(dá)式語(yǔ)言。
- 需要注意的是,在使用 Spring 開(kāi)發(fā)時(shí),除了 Spring 自帶的 JAR 包以外,還需要一個(gè)第三方 JAR 包 commons.logging 處理日志信息。
傳統(tǒng)的spring項(xiàng)目只能使用xml文件來(lái)注入管理bean,Spring 從 2.5 版本開(kāi)始提供了對(duì)注解技術(shù)的全面支持,我們可以使用注解來(lái)實(shí)現(xiàn)自動(dòng)裝配,簡(jiǎn)化 Spring 的 XML 配置。Spring 通過(guò)注解實(shí)現(xiàn)自動(dòng)裝配的步驟如下:
- 引入依賴(lài):spring-aop-5.3.13.jar
- 開(kāi)啟組件掃描:使用 context:component-scan 元素開(kāi)啟自動(dòng)掃描功能
- 使用注解定義Bean:@Component、@Repositort、@Service、@Controller
- 依賴(lài)注入:@Autowired、@Resource
spring的核心:1. 標(biāo)注bean代表讓spring管理,2. 工廠模式+反射機(jī)制提前初始化到spring容器中。而不是等需要用時(shí)使用者主動(dòng)new。
2.2. Spring MVC
Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet。
MVC 模式將應(yīng)用程序劃分成模型(Model)、視圖(View)、控制器(Controller)等三層,如下圖所示:
- Model(模型):一個(gè)模型可以為多個(gè)視圖(View)提供數(shù)據(jù),一套模型(Model)的代碼只需寫(xiě)一次就可以被多個(gè)視圖重用,有效地減少了代碼的重復(fù)性,增加了代碼的可復(fù)用性。
可以理解為 service和dao部分代碼 - View(視圖):指在應(yīng)用程序中專(zhuān)門(mén)用來(lái)與瀏覽器進(jìn)行交互,展示數(shù)據(jù)的資源。在 Web 應(yīng)用中,View 就是我們常說(shuō)的前臺(tái)頁(yè)面,通常由 HTML、JSP、CSS、JavaScript 等組成。
可以理解為前端展示界面 - Controller(控制器):通常指的是,應(yīng)用程序的 Servlet。它負(fù)責(zé)將用戶(hù)的請(qǐng)求交給模型(Model)層進(jìn)行處理,并將 Model 層處理完成的數(shù)據(jù),返回給視圖(View)渲染并展示給用戶(hù)。
可以理解為controller部分代碼
和 MVC 模式類(lèi)似,三層架構(gòu)同樣將系統(tǒng)劃分成了 3 層:
-
表示層(UI):用來(lái)實(shí)現(xiàn)與用戶(hù)的交互,接收用戶(hù)請(qǐng)求,并將請(qǐng)求交給業(yè)務(wù)邏輯層(BLL)和數(shù)據(jù)訪(fǎng)問(wèn)層(DAL)進(jìn)行處理,最后將處理結(jié)果返回給用戶(hù)。
-
業(yè)務(wù)邏輯層(BLL):起到承上啟下的作用,接收表示層傳遞來(lái)的請(qǐng)求,并針對(duì)業(yè)務(wù)對(duì)數(shù)據(jù)進(jìn)行處理,以實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。
-
數(shù)據(jù)訪(fǎng)問(wèn)層(DAL):用于實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互和訪(fǎng)問(wèn),例如從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)、保存或修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)等。
-
依賴(lài)注入復(fù)雜,需要自己手動(dòng)把需要的jar一個(gè)個(gè)添加到pom文件
-
配置復(fù)雜,applicationContext.xml文件用來(lái)管理springbean及DispatcherServlet(視圖解析器)
-
安全校驗(yàn)等各種都是通過(guò)xml文件進(jìn)行配置
Spring MVC 主要的執(zhí)行流程:
- 瀏覽器發(fā)送一個(gè)請(qǐng)求,若請(qǐng)求地址與 web.xml 中配置的前端控制器(DispatcherServlet)的 url-pattern 相匹配,則該請(qǐng)求就會(huì)被前端控制器 DispatcherServlet 攔截;
- 前端控制器(DispatcherServlet )會(huì)讀取 SpringMVC 的核心配置文件,通過(guò)組件掃描獲取到所有的控制器(Contorller);
- 將請(qǐng)求信息和控制器中所有控制器方法標(biāo)識(shí)的 @RequestMapping 注解的 value、method 等屬性值進(jìn)行匹配。若匹配成功,則將請(qǐng)求交給對(duì)應(yīng)的 @RequestMapping 注解所標(biāo)識(shí)的控制器方法處理;
- 處理請(qǐng)求的方法會(huì)返回一個(gè)字符串類(lèi)型的視圖名稱(chēng),該視圖名稱(chēng)會(huì)被 Spring MVC 配置文件中配置的視圖解析器(ViewResolver)解析真正的視圖(View)對(duì)象,最終展示給客戶(hù)端。
2.3. Spring Boot
Spring MVC是基于 Servlet 的一個(gè) MVC 框架 主要解決 WEB 開(kāi)發(fā)的問(wèn)題,因?yàn)?Spring 的配置非常復(fù)雜,各種XML、 JavaConfig、hin處理起來(lái)比較繁瑣。于是為了簡(jiǎn)化開(kāi)發(fā)者的使用,從而創(chuàng)造性地推出了Spring boot,約定優(yōu)于配置,簡(jiǎn)化了spring的配置流程。
說(shuō)得更簡(jiǎn)便一些:Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應(yīng)用組件。大家覺(jué)得挺好用,于是按照這種模式搞了一個(gè) MVC框架(一些用Spring 解耦的組件),用開(kāi)發(fā) web 應(yīng)用( SpringMVC )。然后有發(fā)現(xiàn)每次開(kāi)發(fā)都寫(xiě)很多樣板代碼,為了簡(jiǎn)化工作流程,于是開(kāi)發(fā)出了一些“懶人整合包”(starter),這套就是 Spring Boot。
SpringBoot的簡(jiǎn)便提現(xiàn)在哪里?
- 自動(dòng)配置:約定大于配置,可以簡(jiǎn)化spring的配置流程,注意不是注入而是配置
- 簡(jiǎn)化啟動(dòng):以前web應(yīng)用要使用到tomat服務(wù)器啟動(dòng),而springboot內(nèi)置服務(wù)器容器,通過(guò)@SpringBootApplication中注解類(lèi)中main函數(shù)啟動(dòng)即可
所以整個(gè)springboot的執(zhí)行依賴(lài)于其啟動(dòng)類(lèi)及啟動(dòng)類(lèi)上的注解
自動(dòng)配置的原理依賴(lài)注解@SpringBootApplication-@EnableAutoConfiguration- @Import({AutoConfigurationImportSelector.class})-selectImports方法-spring.factories。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-860681.html
SpringBoot的自動(dòng)裝配也就是通過(guò)@EnableAutoConfiguration注解,加載AutoConfigurationImportSelector類(lèi)中的selectImports方法,進(jìn)而掃描spring.factories文件下的自動(dòng)配置類(lèi),并將其裝配到IOC容器的過(guò)程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860681.html
到了這里,關(guān)于EJB和Spring的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!