在本文中,我们将了解如何将现有的Spring Framework应用程序迁移到Spring Boot应用程序。
Spring Boot不是要取代Spring,而是为了更快更容易地使用它。因此,迁移应用程序所需的大多数更改都与配置有关。在大多数情况下,我们的自定义控制器和其他组件将保持不变。
使用Spring Boot进行开发带来了几个优点:
首先,我们需要一组新的依赖项。Spring Boot提供了方便的入门依赖项,这些依赖项描述符可以为某些功能引入所有必需的技术。
这些优点是您不再需要为每个依赖项指定版本,而是让入门者为您管理依赖项。
最快的入门方法是添加spring-boot-starter-parent pom.xml:
org.springframework.boot
spring-boot-starter-parent
1.5.6.RELEASE
这将负责依赖管理。
我们将在下一节中介绍更多初学者,具体取决于我们将迁移的功能。作为参考,您可以在此处找到完整的启动器列表。
更一般地说,我们希望删除任何显式定义的依赖版本,该版本也由Spring Boot管理。如果没有,我们可能会遇到我们定义的版本与Boot使用的版本之间的不兼容性。
使用Spring Boot构建的每个应用程序都需要定义主入口点。这通常是带有main方法的Java类,使用@SpringBootApplication注释:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
该@SpringBootApplication注释增加了以下说明:
默认情况下,@ SpringBootApplication批注会扫描同一个包或更低版本中的所有类。因此,方便的包结构可能如下所示:
如果您的应用程序是创建ApplicationContext的非Web应用程序,则可以删除此代码并替换为上面的@SpringBootApplication类。
我们可能遇到的问题有多个配置类冲突。为避免这种情况,我们可以过滤扫描的类:
@SpringBootAppliaction
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX,
pattern = "com.baeldung.config.*")})
public class Application {
//...
}
Spring Boot在很大程度上依赖于配置注释,但您仍然可以以注释和XML格式导入现有配置。
要获取现有的@Configuration或组件类,您有两种选择:
要显式导入类,可以在主类上使用@ComponentScan或@Import注释:
@SpringBootApplication
@ComponentScan(basePackages="com.baeldung.config")
@Import(UserRepository.class)
public class Application {
//...
}
官方文档建议在XML配置上使用注释。但是,如果您已经有XML文件,您不希望转换为Java配置,您仍然可以使用@ImportResource导入它们:
@SpringBootApplication
@ImportResource("applicationContext.xml")
public class Application {
//...
}
默认情况下,Spring Boot会在以下位置之一中查找资源文件:
要迁移,我们可以将所有资源文件移动到其中一个位置,或者我们可以通过设置spring.resources.static-locations属性来自定义资源位置:
1 |
|
该框架将自动加载在其中一个位置放置的名为application.properties或application.yml的文件中定义的任何属性:
为避免显式加载属性,我们可以将它们移动到其中一个位置中具有此名称的文件。例如,进入应该出现在类路径上的/ resources文件夹中。
我们还可以从名为application- {profile} .properties的文件中自动加载特定于配置文件的属性。
此外,大量预定义属性名称可用于配置不同的应用程序行为。
您在应用程序中使用的每个Spring框架模块都需要稍作修改,主要与配置有关。我们来看看一些最常用的功能。
Spring Boot为Web应用程序提供了一个启动器,它将引入所有必需的依赖项。这意味着我们可以从Spring框架中删除所有特定于Web的依赖项,并将其替换为spring-boot-starter-web:
org.springframework.boot
spring-boot-starter-web
由于Spring Boot尝试根据类路径尽可能自动配置应用程序,因此添加此依赖项将导致将@EnableWebMvc注释添加到主Application类,以及设置DispatcherServlet bean。
如果您有一个设置DispatcherServlet的WebApplicationInitializer类,则不再需要它,也不再需要@EnableWebMvc注释。
当然,如果我们想要一个自定义行为,我们可以定义我们的bean,在这种情况下,我们将使用我们的bean。
如果我们在@Configuration类上显式使用@EnableWebMvc注释,则将不再启用MVC自动配置。
添加Web启动程序还会确定以下Bean的自动配置:
就构建网页而言,官方文档建议不要使用JSP文件并使用模板引擎。以下模板引擎包含自动配置:Thymeleaf,Groovy,FreeMarker,Mustache。我们需要做的就是使用其中一个添加特定的启动器:
org.springframework.boot
spring-boot-starter-thymeleaf
模板文件应放在/ resources / templates文件夹中。
如果我们想继续使用JSP文件,我们需要配置应用程序以便它可以解析JSP。例如,如果我们的文件位于/ webapp / WEB-INF / views中,那么我们需要设置以下属性:
1 2 |
|
此外,我们还可以使用嵌入式Tomcat服务器运行我们的应用程序,该服务器将通过添加spring-boot-starter-tomcat依赖项在端口8080上自动配置:
org.springframework.boot
spring-boot-starter-tomcat
Spring Boot提供自动配置的其他Web服务器是Jetty和Undertow。
启用Spring Security 的启动器是spring-boot-starter-security:
org.springframework.boot
spring-boot-starter-security
默认情况下,这将创建一个名为“user”的用户,在启动期间记录随机生成的密码,并使用基本身份验证保护所有端点。但是,我们通常希望添加安全配置,这与默认配置不同。
出于这个原因,我们将使用@EnableWebSecurity注释我们现有的类,它扩展了WebSecurityConfigurerAdapter并定义了一个自定义配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
}
根据我们使用的Spring Data实现,我们需要添加相应的启动器。例如,对于JPA,我们可以添加spring-boot-starter-data-jpa依赖项:
org.springframework.boot
spring-boot-starter-data-jpa
如果我们想要使用内存数据库,请为H2,Derby和HSQLDB类型的数据库添加相应的依赖关系启用自动配置。
例如,要使用H2内存数据库,我们所需要的只是h2依赖:
com.h2database
h2
如果我们想使用不同的数据库类型和配置,例如MySQL数据库,那么我们需要依赖关系以及定义配置。
为此,我们可以保留DataSource bean定义或使用预定义的属性:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
spring.datasource.username=user
spring.datasource.password=pass
Spring Boot会自动将Hibernate配置为默认的JPA提供程序,以及transactionManager bean。
在本文中,我们展示了将现有Spring应用程序迁移到较新的Spring Boot框架时遇到的一些常见方案。
总的来说,迁移时的体验当然高度依赖于您构建的应用程序。
本文翻译自:https://www.baeldung.com/spring-boot-migration