springboot 目录结构
问题的发现&解决
之前一直没有觉得目录结构有多么重要,一直到 后面的代码与预期不符时 ,经过长时间的分析以及 Spring包扫描机制的存在 发现可能是目录结构 哪块不对,或者是 在配置处 哪里出了问题(注解 以及 application.properties的配置上)
在最开始的时候,主要 配置类 处(Application.java),我并没有用@SpringBootApplication而是 使用 @EnableAutoConfiguration,然而通过 @RequestMapping注解 只能访问到 主要配置类 里面有@RequestMapping注解 的方法,其他包下的其他类中的其他方法 都不能通过 @RequestMapping注解 访问。
这个 问题困扰了我很久,一直没找出来 有什么毛病,最后尝试 将@EnableAutoConfiguration注解 替换为@SpringBootApplication注解后,问题 开始浮现
启动springboot时,出现如下报错信息
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class:
URL[jar:file:/home/chanllen/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.2.5.RELEASE/spring-boot-autoconfigure-1.2.5.RELEASE.jar!/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$JdbcTemplateConfiguration.class];
This can happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)
经过搜索找到了答案:不应将Appication.java 文件放在src/main/java下,要将它放在src/main/java下的根包里(例如src/main/java/me/hugh 下),接着把其他包以及下面的类都移到 src/main/java/me/hugh 下,再次启动就没问题了
目录结构
me
+- hugh
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|
- root package结构:me.hugh
- 应用主类Application.java置于root package下,通常我们会在应用主类中做一些框架配置扫描等配置,我们放在root package下可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容
- 实体(Entity)与数据访问层(Repository)置于me.hugh.domain包下
- 逻辑层(Service)置于com.hugh.service包下
- Web层(web)置于com.hugh.web包下