- [Spring Boot 系列教程] 目录
- 源码
demo03
在上一篇文章中,介绍了 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
配置:
org.springframework.boot
spring-boot-starter-data-jpa
org.hsqldb
hsqldb
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
接下来我们编写 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 {
}
单元测试
@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
。