詳解如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目
快速創(chuàng)建一個(gè)springboot web工程
以IntelliJ IDEA為例:
1、首先創(chuàng)建一個(gè)項(xiàng)目,創(chuàng)建時(shí)選擇Spring Initializr,然后Next,如下圖:

2、填寫項(xiàng)目信息,如下圖:

3、勾選web

4、最后一步,填寫工程名字點(diǎn)擊finish

第一次創(chuàng)建時(shí)系統(tǒng)會(huì)去下載需要的依賴,耗時(shí)稍長(zhǎng),請(qǐng)耐心等待。
創(chuàng)建成功后,目錄結(jié)構(gòu)如下:項(xiàng)目的根目錄下會(huì)有一個(gè)artifactId+Application命名規(guī)則的入口類,SpringbootLearningApplication

SpringbootLearningApplication這個(gè)類有一個(gè)@SpringBootApplication注解,這是整個(gè)Spring Boot的核心注解,它的目的就是開啟Spring Boot的自動(dòng)配置。
@RestController注解,使之變?yōu)橐粋€(gè)Controller,然后再在里邊提供一個(gè)地址轉(zhuǎn)換方法,如下:

main方法中,右擊選擇run,項(xiàng)目啟動(dòng)完成后,就可以在瀏覽器中直接訪問了。
訪問路徑是http://localhost:8080。
Tip:
如果是第一次創(chuàng)建會(huì)發(fā)現(xiàn),文件上帶有紅圈,文件內(nèi)容不可更改,如下進(jìn)行設(shè)置:

如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目
1創(chuàng)建可部署的war文件
生成可部署war文件的第一步是創(chuàng)建一個(gè) SpringBootServletInitializer的子類并重寫它的configure方法。這樣就可以利用Spring Servlet 3.0的支持,并允許在servlet容器啟動(dòng)時(shí)配置你的應(yīng)用程序。通常,main方法所在的類需要繼承
SpringBootServletInitializer:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
下一步是更新構(gòu)建配置,以便您的項(xiàng)目生成war文件而不是jar文件。如果你使用Maven并使用spring-boot-starter-parent(它為你配置Maven的war插件),你所需要做的就是修改pom.xml文件把工程更改為war工程:
<packaging> war </ packaging>
如果你使用Gradle,你需要修改build.gradle以將war插件用到項(xiàng)目中:
apply plugin:'war'
最后一步是確保內(nèi)置servlet容器不會(huì)干擾要部署war文件的servlet容器。為此,您需要按給定方式聲明內(nèi)置servlet容器依賴關(guān)系。
Maven:
<dependencies>
<!-- … -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- … -->
</dependencies>
Gradle:
dependencies {
// ...
providedRuntime'org.springframework.boot :spring-boot-starter-tomcat'
// ...
}
[注意]
如果您使用的Gradle版本僅支持僅編譯依賴項(xiàng)(2.12或更高版本),則應(yīng)繼續(xù)使用providedRuntime。在其他某些限制條件內(nèi), 如果compileOnly依賴不在測(cè)試類的路徑中,這將導(dǎo)致任何基于Web的集成測(cè)試將失敗。
如果您使用Spring Boot構(gòu)建工具,那么將內(nèi)置Servlet容器依賴關(guān)系標(biāo)記為已提供將產(chǎn)生一個(gè)可執(zhí)行文件,并在目錄中打包提供的依賴lib-provided關(guān)系。這意味著,除了被部署到一個(gè)servlet容器,也可以使用運(yùn)行應(yīng)用程序java -jar的命令行上。
看一下Spring Boot的示例應(yīng)用程序,用于上述配置的基于Maven的示例 。
2為舊的servlet容器創(chuàng)建可部署的war文件
較舊的Servlet容器不支持Servlet 3.0中使用的ServletContextInitializer引導(dǎo)進(jìn)程。 但你仍可以在這些容器中使用Spring和Spring Boot,只是需要添加一個(gè)web.xml到應(yīng)用程序中,并配置它通過DispatcherServlet加載一個(gè)ApplicationContext。
3將現(xiàn)有應(yīng)用程序轉(zhuǎn)換為Spring Boot
對(duì)于非web應(yīng)用程序應(yīng)該很容易(ApplicationContext通過調(diào)用替換為SpringApplication或 SpringApplicationBuilder)。Spring MVC應(yīng)用程序通常需要先創(chuàng)建可部署的war應(yīng)用程序,然后將其遷移到可執(zhí)行的war或jar。jar轉(zhuǎn)war指南
創(chuàng)建一個(gè)繼承自SpringBootServletInitializer(例如,在一個(gè)叫做類Application)的可部署war包,并添加Spring Boot的
@SpringBootApplication注解。例:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//自定義應(yīng)用程序或調(diào)用application.sources(...)添加源
//因?yàn)槲覀兊睦颖旧硎且粋€(gè)@Configuration類(通過@SpringBootApplication)
//我們實(shí)際上不需要重寫這個(gè)方法。
return application;
}
}
記住,無論你放在什么sources只是一個(gè)Spring ApplicationContext,通常已經(jīng)運(yùn)行東西都繼續(xù)在這里運(yùn)行。可能有一些bean你可以以后刪除,讓Spring Boot為它們提供自己的默認(rèn)值,但某些工作應(yīng)優(yōu)先進(jìn)行。
靜態(tài)資源可以移動(dòng)到/public(或/static或)/resources或 /META-INF/resources)在類路徑根目錄中。messages.properties(Spring Boot在類路徑的根目錄中自動(dòng)檢測(cè)到這一點(diǎn))也是如此。
Vanilla對(duì)Spring DispatcherServlet和Spring Security的使用不需要進(jìn)一步的修改。如果你的應(yīng)用程序還有其他特性,如使用其他servlet或過濾器,那么你需要添加一些配置到Application context。web.xml中替換的標(biāo)簽如下:
- 一個(gè)在容器中的Servlet或ServletRegistrationBean類型的帶有@Bean注解的類會(huì)被構(gòu)建安裝,如果它在web.xml中被或中被配置的話。
- 一個(gè)Filter或FilterRegistrationBean類型的帶有@Bean注解的類,其運(yùn)行方式就像先前被和配置的類。
- 一個(gè)在XML文件中的ApplicationContext添加一個(gè)@Import注解就可以添加進(jìn)Application?;蛘咴谝呀?jīng)大量使用注解配置的情況下在幾行代碼中重新定義@Bean注解。
為使war包運(yùn)行,便需向應(yīng)用程序中添加一個(gè)可執(zhí)行的main方法,如
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
[注意]
如果打算將應(yīng)用程序打?yàn)閣ar或可執(zhí)行應(yīng)用程序,需要共享建設(shè)者的自定義中,可以執(zhí)行SpringBootServletInitializer回調(diào)方法和main方法,就像這樣:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return configureApplication(builder);
}
public static void main(String[] args) {
configureApplication(new SpringApplicationBuilder()).run(args);
}
private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {
return builder.sources(Application.class).bannerMode(Banner.Mode.OFF);
}
}
應(yīng)用程序可以分為多個(gè)類別:
- 沒有web.xml的Servlet 3.0+應(yīng)用程序。
- 帶有web.xml的應(yīng)用程序。
- 具有上下文層次結(jié)構(gòu)的應(yīng)用程序。
- 沒有上下文層次結(jié)構(gòu)的應(yīng)用程序。
所有這些都應(yīng)該適合轉(zhuǎn)譯,但每個(gè)可能需要略有不同的技巧。
如果已經(jīng)使用Spring Servlet 3.0+初始化程序支持類,Servlet 3.0+應(yīng)用程序就很容易轉(zhuǎn)譯。通?,F(xiàn)存在 WebApplicationInitializer上的所有代碼都可以遷移到SpringBootServletInitializer。如果現(xiàn)有的應(yīng)用程序有多個(gè)ApplicationContext(例如,使用 AbstractDispatcherServletInitializer),那么可以將所有的上下文源合并為單個(gè)SpringApplication。其中可能遇到的問題是,如果程序運(yùn)行失敗,就需要維護(hù)上下文層次結(jié)構(gòu)。請(qǐng)參閱 構(gòu)建一個(gè)層次的條目的例子。包含Web特定功能的現(xiàn)有父上下文通常需要分解,以便所有ServletContextAware組件都在子上下文中。
非Spring應(yīng)用程序的應(yīng)用程序會(huì)更容易轉(zhuǎn)換為Spring Boot應(yīng)用程序,上述指導(dǎo)可能會(huì)有所幫助,但過程可能會(huì)有所不同。
4將WAR部署到WebLogic
要將Spring Boot應(yīng)用程序部署到WebLogic,必須確保您的servlet初始化程序直接實(shí)現(xiàn)WebApplicationInitializer(即使您從已實(shí)現(xiàn)它的基類擴(kuò)展)。
WebLogic的典型初始化方法:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.web.WebApplicationInitializer;
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
}
如果使用logback,您還需要告訴WebLogic更合適打包的版本,而不是預(yù)先安裝的版本。您可以通過添加一個(gè)WEB-INF/weblogic.xml文件來做到這一點(diǎn) ,內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
http://xmlns.oracle.com/weblogic/weblogic-web-app
http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>org.slf4j</wls:package-name>
</wls:prefer-application-packages>
</wls:container-descriptor>
</wls:weblogic-web-app>
5在舊(Servlet 2.5)容器中部署WAR
Spring Boot使用Servlet 3.0 API來初始化ServletContext(寄存器Servlets 等),所以你不能在Servlet 2.5容器外使用相同的應(yīng)用程序。但是,可以在舊容器上借助于特殊工具來運(yùn)行Spring Boot。如果你添加org.springframework.boot:spring-boot-legacy作為依賴(單獨(dú)維護(hù) Spring Boot的核心,目前在1.0.2.RELEASE),你所需要做的是創(chuàng)建web.xml并聲明一個(gè)context listener、 application context、filters 、servlets 。這個(gè)context listener對(duì)于Spring Boot是一個(gè)特殊的用例,但是對(duì)于Servlet 2.5中的Spring應(yīng)用程序,其余部分是一般用法。例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>demo.Application</param-value>
</context-param>
<listener>
<listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>metricsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>metricsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在這個(gè)例子中,我們使用的是單個(gè)應(yīng)用程序上下文(由context listener創(chuàng)建的)并將其連接到DispatcherServlet用一個(gè)參數(shù)初始化。這在Spring Boot應(yīng)用程序中是很常見的(一般只有一個(gè)application context)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring boot開發(fā)web應(yīng)用JPA過程解析
這篇文章主要介紹了Spring boot開發(fā)web應(yīng)用JPA過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
解析java.library.path和LD_LIBRARY_PATH的介紹與區(qū)別
這篇文章主要介紹了java.library.path和LD_LIBRARY_PATH的介紹與區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
java線程之Happens before規(guī)則案例詳解
這篇文章主要為大家介紹了java線程之Happens-before規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-08-08
java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法示例
這篇文章主要介紹了java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法,結(jié)合實(shí)例形式分析了java正則判定、字符串遍歷及統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
簡(jiǎn)單了解Spring Boot及idea整合jsp過程解析
這篇文章主要介紹了簡(jiǎn)單了解Spring Boot及idea整合jsp過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析
這篇文章主要介紹了POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

