Spring Boot 支持基于 Java 的注解。尽管可以通过 XML 源调使用
你不必将所有的
Spring Boot 自动配置会基于你添加的 jar 依赖试图自动配置你的 Spring 应用。例如,如果
你需要通过选择添加一个
自动配置是非侵入式的,在任何情况下,你都可以开始定义自己的配置来替换自动配置的特定部分。例如,如果你添加自己的
如果你需要找出当前正在应用的自动配置和为什么,你可以使用
如果你发现正在应用特定的你不想使用的自动配置类,你可以使用 import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; import org.springframework.context.annotation.*; @Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
如果这个类不在类路径中,你可以使用这个注解的
你可以自由使用任何标准的 Spring Framework 技术来定义你的 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; } // ... }
如果一个 bean 有一个构造函数,可以省略 @Service public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; public DatabaseAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }
许多 Spring Boot 开发者喜欢在他们的应用上使用自动配置、组件扫描,并且能够在他们的 "application class" 上定义附加的配置。一个
package com.example.myapplication; 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); } }
将应用打包成 jar 并使用嵌入式 HTTP 服务器的一个最大优势是你可以在任何地方运行你的应用。调试 Spring Boot 应用也很容易。你不必指定任何特定的 IDE 插件或扩展。
你可以在 IDE 中像运行一个简单的 Java 应用一样运行一个 Spring Boot 应用。然而,首先你需要导入工程。导入步骤根据你的 IDE 和构建系统会有所变化。大多数 IDE 可以直接导入 Maven 工程,例如 Eclipse 用户可以选择从 如果你不能直接将工程导入你的 IDE 中,你可以使用构建插件生成一个 IDE 元数据。Maven 中包含 Eclipse 和 IDEA 的插件;Gradle 有各种 IDE 的插件。
如果你使用 Spring Boot 的 Maven 或 Gradle 插件来创建一个可执行的 jar 包,你可以通过使用 $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar 它也支持以远程调试模式运行一个打包的应用。这允许你在打包的应用中添加一个调试器,如下面的示例所示: $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myapplication-0.0.1-SNAPSHOT.jar
Spring Boot Maven 插件包含一个 $ mvn spring-boot:run
你可能还想使用 $ export MAVEN_OPTS=-Xmx1024m
Spring Boot Gradle 插件也包含一个 $ gradle bootRun
你可能还想使用 $ export JAVA_OPTS=-Xmx1024m 由于 Spring Boot 应用只是普通的 Java 应用,JVM 热更新应该是开箱即用的。JVM 热更新可以替换的字节码有限制,一个更完整的解决方案是使用 JRebel。
Spring Boot 包含额外的工具集合,可以使应用开发的过程更方便一点。 Maven. <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> Gradle. dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
Spring Boot 支持的几个库使用缓存来提高性能。例如,模板引擎将缓存编译后的模板,以避免重复解析模板文件。另外,在服务静态资源时,Spring MVC 可以将 HTTP 缓存头添加到响应中。 虽然缓存在生产中非常有用,但它在开发过程中可能适得其反,阻止你看到刚才在应用中所做的更改。为此,spring-boot-devtools 将默认禁用这些缓存选项。
缓存选项通常通过你的
因为你在开发 Spring MVC 和 Spring WebFlux 应用时需要更多关于 web 请求的信息,所以开发者工具将为 Spring Framework web 基础设施启用 DEBUG 日志记录。这将为你提供关于传入请求、哪个处理程序正在处理它、响应结果等的信息。如果希望记录所有请求细节(包括潜在的敏感信息),则可以打开
当类路径中的文件修改时,使用
默认情况下,每次应用程序重新启动时,都会展示一个显示状态评估变化的报告。报告显示了在进行更改时应用程序自动配置进行的更改,如添加或删除 bean 和设置配置属性。 若要禁用报告的日志记录,请设置以下属性: spring.devtools.restart.log-condition-evaluation-delta=false
某些资源不一定需要在更改时触发重新启动。例如,Thymeleaf 模板可以就地编辑。默认情况下, spring.devtools.restart.exclude=static/**,public/**
当修改不在类路径中的文件时,你可能也想重启或重载你的应用。为了这样做,可以使用
如果你不想使用重启功能,你可以通过
如果你需要完全禁用重启支持,例如,因为它不能与一个特定的库一起工作,你需要在调用 public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); } 如果你使用一个不断编译已更改文件的 IDE,你可能只希望在特定的时间触发重启。为此,你可以使用一个触发文件,这是一个特殊的文件,在实际触发重新启动检查时进行修改。修改这个文件只触发重启检查,只有 Devtools 检测到它必须要做些事情时,重启才会发生。触发文件应该进行手动更新,或通过 IDE 插件更新。
为了使用触发文件,设置
像前面的的重启与重载比较部分所讲的那样,重启功能是通过两个类加载器实现的。对于大多数应用来说这个方法能很好的工作,但是有时候它也会引起一些类加载问题。
默认情况下,IDE 中的任何开放的工程都会使用重启类加载器进行加载,任何规范的
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
如果当你的应用运行时不想启动实时重载服务器,可以将
通过添加一个名为 ~/.spring-boot-devtools.properties. spring.devtools.reload.trigger-file=.reloadtrigger
Spring Boot 开发者工具是不受本地环境限制的,在运行远程应用时你也可以使用一些功能。远程支持是选择性加入的,为了使它起作用你需要确保 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludeDevtools>false</excludeDevtools> </configuration> </plugin> </plugins> </build>
然后你需要设置 spring.devtools.remote.secret=mysecret
远程 devtools 需要两部分提供支持:一个接收连接的服务器端,一个运行在 IDE 中的客户端应用。当设置
远程客户端应用设计为从 IDE 中运行。你需要运行
例如,如果你在使用 Eclipse 或 STS,你有一个名为
一个运行的远程客户端如下: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|==============|___/===================================/_/_/_/ :: Spring Boot Remote :: 2.1.0.BUILD-SNAPSHOT 2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools) 2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy 2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'. 2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
远程客户端会像本地重启那样监控你应用的类路径的变化。任何资源的更新都会推送到远程应用并触发重启(如果需要的话)。如果你在迭代一个没有本地的使用云服务的功能,它是非常有帮助的。通常更新和重启比整个重新构建部署更快。
可执行 jar 可以用来进行生产部署。当它们是自包含时,理想情况下也是适合云部署的。
对于其它的生产就绪功能,例如健康、审计和监控 REST 或 JMX 端点,考虑添加 现在你应该对怎么使用 Spring Boot 以及应该循序的一些最佳实践有了很好的理解。你可以继续深入学习具体的 Spring Boot 特性,或者你可以跳过这些,直接阅读 Spring Boot “生产就绪” 方面的内容。 |