在上一篇文章中,介绍了 Spring Boot 的构建工具及原理,本篇文章将介绍 Spring Boot 项目的结构及配置。
项目结构
Spring Boot 虽然不需要任何特定的代码布局,但是,官方还是提供了一些最佳实践,下面将一一介绍。
包命名规范
当 java 的类不在任何一个包下面的时候,将会使用默认的包,但是这是不建议使用的,任何 java 类都应该在某个包下面,一般来说,Java 的包命名规范为将域名反过来写,如:https://www.docs4dev.com 这个域名,对应的包就是 com.docs4dev.项目名称(在教程中使用的包名就是:com.docs4dev.springboot)。
项目布局
我们知道 Spring Boot 可以通过 @SpringBootApplication 注解扫描项目的 Bean 和配置项,它是个组合注解,来看下它的源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}
这里有一个 @ComponentScan 的注解,它用于 Spring Boot 扫描 Bean 和配置。
Spring Boot 官方推荐将标记有 @SpringBootApplication 注解的启动类放到项目的 Root package 下,因为 @SpringBootApplication 会默认搜索当前包以及子包(scanBasePackages),查找系统配置(如:JPA 配置)。以下是官方推荐的项目布局:
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
其中,Application.java 就是系统启动类,domain 包一般是放置 JPA 的 Entity ,service 包是业务逻辑层,web 包是 View 层,用于对外提供接口。你还可以根据自身需求添加相应的包,如 util 包常用于存放工具类。
系统配置
在 Spring Boot 中,可以使用传统的 xml 方式来配置相关的属性,也可以使用 Java 代码的方式进行配置,官方推荐是以 Java 代码的方式进行配置,这样不仅更灵活而且也比 xml 方式更简洁。
当我们需要新增某个配置的时候,可以为其添加 @Configuration 注解,Spring Boot 会自动扫描标记有 @Configuration 的类并将其注册为 Bean,这样就可以直接在项目中使用了。
当你有许多的配置项时,不需要将它们全部放到一个类中,Spring Boot 提供了一个注解@Import ,它可以将多个配置类聚合。如果因为历史原因,你需要导入 xml 配置,Spring Boot 也提供了另一个注解 @ImportResource 来做这件事。
自动配置
在上面 @SpringBootApplication 的源码中,我们还可以看到另一个注解 @EnableAutoConfiguration ,它使得 Spring Boot 可以自动的帮我们进行一些设置,例如你在项目中添加了 @EnableAutoConfiguration 注解或是直接使用了 @SpringBootApplication 注解,并在 classpath 中存在 HSQLDB 的依赖,你无须做任何事情,就可以直接在项目中使用 HSQLDB 相关的操作。
我们还是通过 https://start.spring.io/ 来创建新的工程,并选择 JPA Lombok HSQLDB ,以下是 mavan 的 dependencies配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
接下来我们编写 JPA 的 Entity Repository 和 Junit 测试类:
Entity
@Getter
@Setter
@Entity
@Table(name ="user")
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
}
Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
单元测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void autoconfigTest() {
User user = new User();
user.setUsername("tom");
userRepository.save(user);
User dbUser = userRepository.findById(user.getId()).orElseThrow(RuntimeException::new);
assertThat(dbUser).isEqualToComparingFieldByField(user);
}
}
除此之外,不需要其它操作,我们没有配置任何关于数据库连接的信息,让我们运行以上测试,会发现测试会完美通过,没有任何异常,这就是 Spring Boot @EnableAutoConfiguration 的魔力,它帮我们大大简化了开发中这些重复性的工作。
替换默认配置
Spring Boot 提供的自动配置功能虽然非常强大,但是某些时候我们还是需要自定义配置项,这个时候,我们就可以禁用 Spring Boot 的自动配置并提供自己的配置,这个实现非常简单,就是通过 SpringBootApplication 中的 exclude 参数禁用某些配置,自行编写相关配置项后添加 @Configuration 注解即可,例如在此处我们禁用 SPring Boot 的 DataSourceAutoConfiguration ,并添加自己的 MyCustomDataSourceConfigration:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
@Configuration
public class MyCustomDataSourceConfigration {
}
Spring Bean 注入
在 Spring Boot 中,你可以使用 Spring 中任何的 Bean 注入方式(构造器注入,Setter 注入等),同时它也支持 Spring 中定义 Bean 的注解(如: @Component, @Service, @Repository, @Controller 等等),标记了这些注解的类都会被 @ComponentScan 加载为 Spring Bean 。
结语
关于 Spring Boot 的配置就讲到此处了,下一篇文章将介绍 spring-boot-devtools 。
本文详细介绍了SpringBoot项目的结构、配置方式以及自动配置功能,包括包命名规范、项目布局、系统配置方法、自动配置原理及如何禁用或替换默认配置。
4万+

被折叠的 条评论
为什么被折叠?



