添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在本文中,我们将研究如何将现有的Spring框架应用程序迁移到SpringBoot应用程序。

Spring Boot并不是为了取代Spring,而是为了使使用它更快更容易。 因此,迁移应用程序所需的大多数更改都与配置有关。在大多数情况下,我们的自定义控制器和其他组件将保持不变。

使用Spring Boot进行开发有几个优点:

  • 更简单的依赖关系管理
  • 默认自动配置
  • 嵌入式web服务器
  • 应用程序度量和运行状况检查
  • 高级外部化配置
  • Spring Boot Starters

    首先,我们需要一组新的依赖项。 springboot 提供了方便的starter依赖项 ,这些依赖项描述符可以为某些功能引入所有必要的技术。

    这样做的好处是,您不再需要为每个依赖项指定版本,而是让初学者为您管理依赖项。

    最快的入门方法是添加 springboot starter父级 pom.xml :

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
    </parent>

    这将负责依赖关系管理。

    我们希望删除任何显式定义的依赖版本,它也由 springboot 管理。否则,我们可能会遇到定义的版本和Boot使用的版本之间的不兼容。

    应用程序入口点

    使用 spring boot构建的每个应用程序都需要定义主入口点。这通常是一个带有 main 方法的Java类,用 @SpringBootApplication 注释:

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    

    @SpringBootApplication注释添加了以下注释:

  • @Configuration–将类标记为bean定义的源
  • @EnableAutoConfiguration–它告诉框架根据类路径上的依赖关系自动添加bean
  • @ComponentScan–它扫描与应用程序类或更低版本在同一个包中的其他配置和bean
  • 默认情况下,@SpringBootApplication注释扫描同一个包或以下包中的所有类。因此,方便的包结构可以如下所示:

    如果您的应用程序是创建ApplicationContext的非web应用程序,则可以删除此代码并用上面的@SpringBootApplication类替换。

    我们可能遇到的问题有多个配置类冲突。为了避免这种情况,我们可以过滤扫描的类:

    @SpringBootAppliaction
    @ComponentScan(excludeFilters = { 
      @ComponentScan.Filter(type = FilterType.REGEX, 
      pattern = "com.baeldung.config.*")})
    public class Application {
        //...
    

    导入配置和组件

    springboot在很大程度上依赖于注释进行配置,但是您仍然可以以注释和XML格式导入现有配置。

    对于要获取的现有@Configurationcomponent类,有两个选项:

  • 将现有类移到与主应用程序类包相同或低于主应用程序类包的包中
  • 显式导入类
  • 要显式导入类,可以在主类上使用@ComponentScan@import注释:

    @SpringBootApplication
    @ComponentScan(basePackages="com.baeldung.config")
    @Import(UserRepository.class)
    public class Application {
        //...
    

    官方文档建议在XML配置上使用注释。但是,如果已经有不希望转换为Java配置的XML文件,您仍然可以使用@ImportResource:

    @SpringBootApplication
    @ImportResource("applicationContext.xml")
    public class Application {
        //...
    

    迁移应用程序资源

    默认情况下,Spring Boot会在以下位置之一查找资源文件:

  • /resources
  • /public
  • /static
  • /META-INF/resources
  • 要迁移,我们可以将所有资源文件移动到其中一个位置,也可以通过设置spring.resources.static-locations属性:

    spring.resources.static-locations=classpath:/images/,classpath:/jsp/

    迁移应用程序属性

    框架将自动加载在名为application.properties 或者application.yml 放置在以下位置之一:

  • 当前目录的a/config子目录
  • 类路径上的/config目录
  • 为了避免显式加载属性,我们可以将它们移动到这些位置之一具有此名称的文件中。例如,放入类路径上应该存在的/resources文件夹中。

    我们还可以从名为application-{profile}.properties的文件中自动加载特定于概要文件的属性。

    此外,大量预定义的属性名可用于配置不同的应用程序行为。

    在应用程序中使用的每个Spring框架模块都需要稍加修改,主要与配置有关。让我们看看一些最常用的功能。

    迁移SpringWeb应用程序

    Web Starter

    springboot为web应用程序提供了一个启动程序,它将引入所有必要的依赖关系。这意味着我们可以从Spring框架中删除所有特定于web的依赖项,并用Spring boot starter web替换它们:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    由于Spring Boot会尽可能根据类路径自动配置应用程序,因此添加此依赖关系将导致将@EnableWebMvc注释添加到主应用程序类,并设置DispatcherServlet bean

    如果您有一个WebApplicationInitializer类来设置DispatcherServlet,则不再需要它,@EnableWebMvc注释也不再需要。

    当然,如果需要自定义行为,我们可以定义bean,在这种情况下,将使用bean。

    如果我们在@Configuration类上显式使用@EnableWebMvc注释,那么MVC自动配置将不再被启用。

    添加web starter还确定以下bean的自动配置:

  • 支持从类路径上名为/static、/public、/resources或/META-INF/resources的目录提供静态内容
  • HttpMessageConverter bean,用于JSON和XML等常见用例
  • 处理所有错误的错误映射
  • View Technologies

    至于构建网页,官方文档建议不要使用JSP文件,而是使用模板引擎。自动配置包括以下模板引擎:Thymeleaf、Groovy、FreeMarker、Mustache。要使用其中一个,我们只需添加特定的启动程序:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    模板文件应放在/resources/templates文件夹中。

    如果我们想继续使用JSP文件,我们需要配置应用程序以便它能够解析JSP。例如,如果文件位于/webapp/WEB-INF/views中,则需要设置以下属性:

    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    

    嵌入式Web服务器

    此外,我们还可以使用嵌入式Tomcat服务器运行应用程序,通过添加spring boot starter Tomcat依赖项,该服务器将在端口8080上自动配置:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>

    springboot提供自动配置的其他web服务器有Jetty和Undertow。

    迁移Spring Security应用程序

    启用Spring Security的启动程序是Spring boot starter Security

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    默认情况下,这将创建一个名为“user”的用户,并在启动期间记录一个随机生成的密码,并使用基本身份验证保护所有端点。但是,我们通常希望添加我们的安全配置,这与默认配置不同。

    因此,我们将使用@EnableWebSecurity对现有类进行注释,它扩展了WebSecurityConfigurerAdapter并定义了一个自定义配置:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        // ...
    

    迁移Spring Data应用程序

    根据我们使用的Spring数据实现,我们需要添加相应的启动程序。例如,对于JPA,我们可以添加spring boot starter数据JPA依赖项:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    如果要使用内存中的数据库,请为H2、Derby和HSQLDB类型的数据库添加相应的启用依赖关系的自动配置。

    例如,要使用内存中的H2数据库,我们只需要H2依赖关系:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
    

    如果我们想使用不同的数据库类型和配置,比如MySQL数据库,那么我们需要依赖关系以及定义配置。

    为此,我们可以保留数据源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

    springboot将自动配置Hibernate作为默认的JPA提供者,以及transactionmanagerbean。

    在本文中,我们展示了将现有Spring应用程序迁移到较新的Spring引导框架时遇到的一些常见场景。

    总的来说,迁移时的体验当然会高度依赖于所构建的应用程序。

    无代码侵入的数据采集和Mock,支持Spring、Dubbo、Redis、Mybatis等开源框架的录制和回放;

    支持各种复杂业务场景的验证:多线程并发、异步回调、写操作等;

    欢迎扫码进QQ群交流

    官网:http://arextest.com
    github:https://github.com/arextest