本站公告: PUI正式上线,欢迎体验。

构建系统Spring Boot

框架积累 Mignon 2788浏览 0评论

强烈建议你选择一个支持依赖管理,能消费发布到"Maven中央仓库"的artifacts的构建系统,比如Maven或Gradle。使用其他构建系统也是可以的,比如Ant,但它们可能得不到很好的支持。

构建系统

1、在开发工具IntelliJ IDEA中构建Spring Boot项目。

 构建系统Spring Boot 微服务 项目开发 Spring Boot 框架积累 第1张

创建新的项目    ==>  选择Spring initializr

 构建系统Spring Boot 微服务 项目开发 Spring Boot 框架积累 第2张

2、手动创建Maven项目

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version></parent><dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency></dependencies>

或GRADLE项目

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.4.1.RELEASE")
}

组织你的代码


Spring Boot不要求使用任何特殊的代码结构,不过,遵循以下的一些最佳实践还是挺有帮助的。

使用"default"包

当类没有声明package时,它被认为处于default package下。通常不推荐使用default package,因为对于使用@ComponentScan,@EntityScan或@SpringBootApplication注解的Spring Boot应用来说,它会扫描每个jar中的类,这会造成一定的问题。

 我们建议你遵循Java推荐的包命名规范,使用一个反转的域名(例如com.example.project)。

放置应用的main类

通常建议将应用的main类放到其他类所在包的顶层(root package),并将@EnableAutoconfiguration注解到你的main类上,这样就隐式地定义了一个基础的包搜索路径(search package),以搜索某些特定的注解实体(比如@Service,@Component等) 。例如,如果你正在编写一个JPA应用,Spring将搜索@EnableAutoConfiguration注解的类所在包下的@Entity实体。

采用root package方式,你就可以使用@ComponentScan注解而不需要指定basePackage属性,也可以使用@SpringBootApplication注解,只要将main类放到root package中。

下面是一个典型的结构:

com
 +- example
     +- myproject
         +- Application.java
         |
         +- domain
         |   +- Customer.java
         |   +- CustomerRepository.java
         |
         +- service
         |   +- CustomerService.java
         |
         +- web
             +- CustomerController.java

配置类

Spring Boot提倡基于Java的配置。尽管你可以使用XML源调用SpringApplication.run(),不过还是建议你使用@Configuration类作为主要配置源。通常定义了main方法的类也是使用@Configuration注解的一个很好的替补。

注:虽然网络上有很多使用XML配置的Spring示例,但你应该尽可能的使用基于Java的配置,搜索查看enable*注解就是一个好的开端。

导入其他配置类


你不需要将所有的@Configuration放进一个单独的类,@Import注解可以用来导入其他配置类。另外,你也可以使用@ComponentScan注解自动收集所有Spring组件,包括@Configuration类。


导入XML配置


如果必须使用XML配置,建议你仍旧从一个@Configuration类开始,然后使用@ImportResource注解加载XML配置文件。


自动配置

Spring Boot自动配置(auto-configuration)尝试根据添加的jar依赖自动配置你的Spring应用。例如,如果classpath下存在HSQLDB,并且你没有手动配置任何数据库连接的beans,那么Spring Boot将自动配置一个内存型(in-memory)数据库。

实现自动配置有两种可选方式,分别是将@EnableAutoConfiguration或@SpringBootApplication注解到@Configuration类上。

注:你应该只添加一个@EnableAutoConfiguration注解,通常建议将它添加到主配置类(primary@Configuration)上。


逐步替换自动配置

自动配置(Auto-configuration)是非侵入性的,任何时候你都可以定义自己的配置类来替换自动配置的特定部分。例如,如果你添加自己的DataSource bean,默认的内嵌数据库支持将不被考虑。

如果需要查看当前应用启动了哪些自动配置项,你可以在运行应用时打开--debug开关,这将为核心日志开启debug日志级别,并将自动配置相关的日志输出到控制台。


禁用特定的自动配置项

如果发现启用了不想要的自动配置项,你可以使用@EnableAutoConfiguration注解的exclude属性禁用它们:

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

如果该类不在classpath中,你可以使用该注解的excludeName属性,并指定全限定名来达到相同效果。最后,你可以通过spring.autoconfigure.exclude属性exclude多个自动配置项(一个自动配置项集合)。

注 通过注解级别或exclude属性都可以定义排除项。

Spring Beans和依赖注入

你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。简单起见,我们经常使用@ComponentScan注解搜索beans,并结合@Autowired构造器注入。

如果遵循以上的建议组织代码结构(将应用的main类放到包的最上层,即root package),那么你就可以添加@ComponentScan注解而不需要任何参数,所有应用组件(@Component, @Service, @Repository,@Controller等)都会自动注册成Spring Beans。

下面是一个@Service Bean的示例,它使用构建器注入获取一个需要的RiskAssessor bean。

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    @Autowired
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...
}

注 注意使用构建器注入允许riskAssessor字段被标记为final,这意味着riskAssessor后续是不能改变的。

使用@SpringBootApplication注解

很多Spring Boot开发者经常使用@Configuration,@EnableAutoConfiguration,@ComponentScan注解他们的main类,由于这些注解如此频繁地一块使用(特别是遵循以上最佳实践的时候),Spring Boot就提供了一个方便的@SpringBootApplication注解作为代替。

@SpringBootApplication注解等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan:

package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {

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

}

注 @SpringBootApplication注解也提供了用于自定义@EnableAutoConfiguration和@ComponentScan属性的别名(aliases)。

运行应用程序

将应用打包成jar,并使用内嵌HTTP服务器的一个最大好处是,你可以像其他方式那样运行你的应用程序。调试Spring Boot应用也很简单,你都不需要任何特殊IDE插件或扩展!

注:本章节只覆盖基于jar的打包,如果选择将应用打包成war文件,你最好参考相关的服务器和IDE文档。

从IDE中运行

你可以从IDE中运行Spring Boot应用,就像一个简单的Java应用,但首先需要导入项目。导入步骤取决于你的IDE和构建系统,大多数IDEs能够直接导入Maven项目,例如Eclipse用户可以选择File菜单的Import…--> Existing Maven Projects。

如果不能直接将项目导入IDE,你可以使用构建系统生成IDE的元数据。Maven有针对Eclipse和IDEA的插件;Gradle为各种IDEs提供插件。

注 如果意外地多次运行一个web应用,你将看到一个"端口已被占用"的错误。STS用户可以使用Relaunch而不是Run按钮,以确保任何存在的实例是关闭的。

作为一个打包后的应用运行

如果使用Spring Boot Maven或Gradle插件创建一个可执行jar,你可以使用java -jar运行应用。例如:

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

Spring Boot支持以远程调试模式运行一个打包的应用,下面的命令可以为应用关联一个调试器:

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myproject-0.0.1-SNAPSHOT.jar

使用Maven插件运行

Spring Boot Maven插件包含一个run目标,可用来快速编译和运行应用程序,并且跟在IDE运行一样支持热加载。

$ mvn spring-boot:run

你可以使用一些有用的操作系统环境变量:

$ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M

使用Gradle插件运行

Spring Boot Gradle插件也包含一个bootRun任务,可用来运行你的应用程序。无论你何时import spring-boot-gradle-plugin,bootRun任务总会被添加进去。

$ gradle bootRun

你可能想使用一些有用的操作系统环境变量:

$ export JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=128M

热交换

由于Spring Boot应用只是普通的Java应用,所以JVM热交换(hot-swapping)也能开箱即用。不过JVM热交换能替换的字节码有限制,想要更彻底的解决方案可以使用Spring Loaded项目或JRebel。spring-boot-devtools模块也支持应用快速重启(restart)。

转载请注明:码农博客 » 构建系统Spring Boot

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • 验证码 (必填)点击刷新验证码