[Spring Boot 系列教程] 项目结构及自动配置机制

上一篇文章中,介绍了 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 包一般是放置 JPAEntityservice 包是业务逻辑层,web 包是 View 层,用于对外提供接口。你还可以根据自身需求添加相应的包,如 util 包常用于存放工具类。

系统配置

Spring Boot 中,可以使用传统的 xml 方式来配置相关的属性,也可以使用 Java 代码的方式进行配置,官方推荐是以 Java 代码的方式进行配置,这样不仅更灵活而且也比 xml 方式更简洁。

当我们需要新增某个配置的时候,可以为其添加 @Configuration 注解,Spring Boot 会自动扫描标记有 @Configuration 的类并将其注册为 Bean,这样就可以直接在项目中使用了。

当你有许多的配置项时,不需要将它们全部放到一个类中,Spring Boot 提供了一个注解@Import ,它可以将多个配置类聚合。如果因为历史原因,你需要导入 xml 配置,Spring Boot 也提供了另一个注解 @ImportResource 来做这件事。

自动配置

扫描二维码关注公众号,回复: 5185195 查看本文章

在上面 @SpringBootApplication 的源码中,我们还可以看到另一个注解 @EnableAutoConfiguration ,它使得 Spring Boot 可以自动的帮我们进行一些设置,例如你在项目中添加了 @EnableAutoConfiguration 注解或是直接使用了 @SpringBootApplication 注解,并在 classpath 中存在 HSQLDB 的依赖,你无须做任何事情,就可以直接在项目中使用 HSQLDB 相关的操作。

我们还是通过 https://start.spring.io/ 来创建新的工程,并选择 JPA Lombok HSQLDB ,以下是 mavandependencies配置:

<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>

接下来我们编写 JPAEntity RepositoryJunit 测试类:

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 BootDataSourceAutoConfiguration ,并添加自己的 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

猜你喜欢

转载自blog.csdn.net/weixin_34023863/article/details/86932590
今日推荐