Spring Boot框架自己并无对工程结构有特别的要求,可是按照最佳实践的工程结构能够帮助咱们减小可能会碰见的坑,尤为是Spring包扫描机制的存在,若是您使用最佳实践的工程结构,能够免去很多特殊的配置工做。java
如下结构是比较推荐的package组织方式:git
com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- web | +- CustomerController.java |
root package
:com.example.myproject
,全部的类和其余package都在root package之下。Application.java
,该类直接位于root package
下。一般咱们会在应用主类中作一些框架配置扫描等配置,咱们放在root package下能够帮助程序减小手工配置来加载到咱们但愿被Spring加载的内容com.example.myproject.domain
包:用于定义实体映射关系与数据访问相关的接口和实现com.example.myproject.service
包:用于编写业务逻辑相关的接口与实现com.example.myproject.web
:用于编写Web层相关的实现,好比:Spring MVC的Controller等上面的结构中,root package
与应用主类的位置是整个结构的关键。因为应用主类在root package
中,因此按照上面的规则定义的全部其余类都处于root package
下的其余子包以后。默认状况下,Spring Boot的应用主类会自动扫描root package
以及全部子包下的全部类来进行初始化。github
什么意思呢?举个例子,假设咱们将com.example.myproject.web
包与上面所述的root package
:com.example.myproject
放在同一级,像下面这样:web
com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- web | +- CustomerController.java |
这个时候,应用主类Application.java
在默认状况下就没法扫描到com.example.myproject.web
中的Controller定义,就没法初始化Controller中定义的接口。spring
那么若是,咱们必定要加载非root package
下的内容怎么办呢?框架
方法一:使用@ComponentScan
注解指定具体的加载包,好比:dom
@SpringBootApplication @ComponentScan(basePackages="com.example") public class Bootstrap { public static void main(String[] args) { SpringApplication.run(Bootstrap.class, args); } }
这种方法经过注解直接指定要扫描的包,比较直观。若是有这样的需求也是能够用的,可是原则上仍是推荐以上面的典型结构来定义,这样也能够少写一些注解,代码更加简洁。spa
方法二:使用@Bean
注解来初始化,好比:code
@SpringBootApplication public class Bootstrap { public static void main(String[] args) { SpringApplication.run(Bootstrap.class, args); } @Bean public CustomerController customerController() { return new CustomerController(); } }
这种方法在业务开发的时候并非特别推荐,更适合用于框架封装等场景,关于更多封装上的技巧,后面咱们在进阶教程中详细讲解。blog
若是读者以为本身团队使用的工程结构不错,欢迎留言分享~
本教程配套仓库:
若是您以为本文不错,欢迎Star支持,您的关注是我坚持的动力!