强烈建议你选择一个支持依赖管理,能消费发布到"Maven中央仓库"的artifacts的构建系统,比如Maven或Gradle。使用其他构建系统也是可以的,比如Ant,但它们可能得不到很好的支持。
构建系统
1、在开发工具IntelliJ IDEA中构建Spring Boot项目。
创建新的项目 ==> 选择Spring initializr
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