查看原文
其他

Spring Boot 2.x基础教程:工程结构推荐

翟永超 程序猿DD 2020-10-16

点击蓝色“程序猿DD”关注我哟

加个“星标”,不忘签到哦

Spring Boot框架本身并没有对工程结构有特别的要求,但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑,尤其是Spring包扫描机制的存在,如果您使用最佳实践的工程结构,可以免去不少特殊的配置工作。

典型示例

以下结构是比较推荐的package组织方式:

  1. com

  2. +- example

  3. +- myproject

  4. +- Application.java

  5. |

  6. +- domain

  7. | +- Customer.java

  8. | +- CustomerRepository.java

  9. |

  10. +- service

  11. | +- CustomerService.java

  12. |

  13. +- web

  14. | +- CustomerController.java

  15. |

  • rootpackage: com.example.myproject,所有的类和其他package都在root package之下。

  • 应用主类: Application.java,该类直接位于 rootpackage下。通常我们会在应用主类中做一些框架配置扫描等配置,我们放在root package下可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容

  • com.example.myproject.domain包:用于定义实体映射关系与数据访问相关的接口和实现

  • com.example.myproject.service包:用于编写业务逻辑相关的接口与实现

  • com.example.myproject.web:用于编写Web层相关的实现,比如:Spring MVC的Controller等

上面的结构中, rootpackage与应用主类的位置是整个结构的关键。由于应用主类在 rootpackage中,所以按照上面的规则定义的所有其他类都处于 rootpackage下的其他子包之后。默认情况下,Spring Boot的应用主类会自动扫描 rootpackage以及所有子包下的所有类来进行初始化。

什么意思呢?举个例子,假设我们将 com.example.myproject.web包与上面所述的 rootpackage: com.example.myproject放在同一级,像下面这样:

  1. com

  2. +- example

  3. +- myproject

  4. +- Application.java

  5. |

  6. +- domain

  7. | +- Customer.java

  8. | +- CustomerRepository.java

  9. |

  10. +- service

  11. | +- CustomerService.java

  12. |

  13. +- web

  14. | +- CustomerController.java

  15. |

这个时候,应用主类 Application.java在默认情况下就无法扫描到 com.example.myproject.web中的Controller定义,就无法初始化Controller中定义的接口。

非典型结构下的初始化

那么如果,我们一定要加载非 rootpackage下的内容怎么办呢?

方法一:使用 @ComponentScan注解指定具体的加载包,比如:

  1. @SpringBootApplication

  2. @ComponentScan(basePackages="com.example")

  3. public class Bootstrap {


  4. public static void main(String[] args) {

  5. SpringApplication.run(Bootstrap.class, args);

  6. }


  7. }

这种方法通过注解直接指定要扫描的包,比较直观。如果有这样的需求也是可以用的,但是原则上还是推荐以上面的典型结构来定义,这样也可以少写一些注解,代码更加简洁。

方法二:使用 @Bean注解来初始化,比如:

  1. @SpringBootApplication

  2. public class Bootstrap {


  3. public static void main(String[] args) {

  4. SpringApplication.run(Bootstrap.class, args);

  5. }


  6. @Bean

  7. public CustomerController customerController() {

  8. return new CustomerController();

  9. }


  10. }

这种方法在业务开发的时候并不是特别推荐,更适合用于框架封装等场景,关于更多封装上的技巧,后面我们在进阶教程中详细讲解。

如果读者觉得自己团队使用的工程结构不错

欢迎留言分享~

系列回顾


重磅推荐

一直都有推荐小马哥的Spring Boot以及Spring Cloud讲座给大家,为什么没有推荐别人的呢?主要还是比较认可小马哥的解读,不像其他课程那样千篇一律,缺少自己的思考。这次小马哥的书终于出版了,我觉得必须要给大家推荐一下:

推荐阅读


号外:最近整理了之前编写的一系列内容做成了PDF,关注我并回复相应口令获取:

001 :领取《Spring Boot基础教程》

002 :领取《Spring Cloud基础教程》



自律到极致 - 人生才精致:第3期”正在筹备中

关注我,加个星标,不忘签到哦~


2019

与大家聊聊技术人的斜杠生活

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存