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

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

典型示例

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

com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|
  • root packagecom.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以及所有子包下的所有类来进行初始化。

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

com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|

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

非典型结构下的初始化

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

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

@SpringBootApplication
@ComponentScan(basePackages="com.example")
public class Bootstrap {

public static void main(String[] args) {
SpringApplication.run(Bootstrap.class, args);
}

}

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

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

@SpringBootApplication
public class Bootstrap {

public static void main(String[] args) {
SpringApplication.run(Bootstrap.class, args);
}

@Bean
public CustomerController customerController() {
return new CustomerController();
}

}

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

如果读者觉得自己团队使用的工程结构不错,欢迎留言分享~

代码示例

本教程配套仓库:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

专栏推荐

  • Spring Boot从入门到精通
  • Spring Cloud从入门到精通

关联内容

Spring Boot工程结构推荐 - 1.x版本


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指Offer - 面试题18. 删除链表的节点

1. 题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么…

因为工资补贴邮件被划空银行卡?搜狐全体员工被诈骗始末

文 | 小戏“叮~”如果你的手机弹出了新邮件提示,弹窗显示【xx公司财务部】关于发布最新工资补贴通知……,你会怎么想?当我看到了正确的公司名,与或许有一定道理的工资补贴,这些信息还是会驱使我带着疑惑打开邮件&#…

剑指Offer - 面试题24. 反转链表(遍历/递归)

1. 题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制&#xff1a; 0 < 节点个数 < 5000来源&#xff1a;力扣&…

我是粉红猪佩奇,我要把粉色吹风机写进 IJCAI 论文!

文 | 智商掉了一地当小猪佩奇的忠实观众进行AI研究&#xff0c;论文配图居然是这样的风格……在介绍接下来的内容前&#xff0c;我们先来看一则笑话&#xff1a;小猪佩奇哭着对妈妈说&#xff1a;“小伙伴们都说我长得像粉色吹风机。” 猪妈妈安慰道&#xff1a;“尽瞎说&#…

Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候&#xff0c;是否因为其繁杂的配置而退却了&#xff1f;在你第n次使用Spring框架的时候&#xff0c;是否觉得一堆反复黏贴的配置有一些厌烦&#xff1f;那么您就不妨来试试使用Spring Boot来让你更易上手&#xff0c;更简单快捷地构建…

剑指Offer - 面试题64. 求1+2+…+n(递归)

1. 题目 求 12…n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 示例 1&#xff1a; 输入: n 3 输出: 6示例 2&#xff1a; 输入: n 9 输出: 45限制&#xff1a; 1 < n < 10000来源&…

AI社区炸锅了!一句话哄一哄就能让GPT-3准确率暴涨61%!

文 | 梦晨 明敏 发自 凹非寺源 | 量子位一觉醒来&#xff0c;机器学习社区炸了锅。因为最新研究发现&#xff0c;只要对GPT-3说一句“让我们一步一步地思考”&#xff0c;就能让它正确回答出以前不会的问题。比如下面这个例子&#xff1a;16个球中有一半是高尔夫球&#xff0c;…

全网Star最多(近20k)的Spring Boot开源教程 2019 年要继续更新了!

从2016年1月开始写博客&#xff0c;默默地更新《Spring Boot系列教程》&#xff0c;从无人问津到千万访问&#xff0c;作为一个独立站点&#xff08;http://blog.didispace.com&#xff09;&#xff0c;相信只有那些跟我一样&#xff0c;坚持维护自己独立博客的童鞋才能体会这有…

剑指Offer - 面试题65. 不用加减乘除做加法(位运算,要看哦)

1. 题目 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a 1, b 1 输出: 2提示&#xff1a; a, b 均可能是负数或 0 结果不会溢出 32 位整数来源&#xff1a;力扣&#xff08;LeetCode&am…

Spring Boot中如何扩展XML请求和响应的支持

在之前的所有Spring Boot教程中&#xff0c;我们都只提到和用到了针对HTML和JSON格式的请求与响应处理。那么对于XML格式的请求要如何快速的在Controller中包装成对象&#xff0c;以及如何以XML的格式返回一个对象呢&#xff1f; 实现原理&#xff1a;消息转换器&#xff08;M…

我在斯坦福做的科研demo…要被导师带去美国国会演讲?

文 | Jazon编 | 小戏大家好&#xff0c;我是 Jazon。时光荏苒&#xff0c;一转眼我已经快要从 Stanford CS 系毕业了。今年7月&#xff0c;我将开始谷歌总部工作&#xff0c;短期内会在硅谷定居&#xff0c;湾区的朋友们欢迎约起呀。笔者去年写过一篇文章&#xff0c;分享了我研…

剑指Offer - 面试题21. 调整数组顺序使奇数位于偶数前面(双指针,原地算法)

1. 题目 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,2,4] 注&#xff1a;[3,1,2,4]…

使用Cloud Studio在线编写、调试和管理Spring Boot应用

在之前的《Spring Boot基础教程》中&#xff0c;我们介绍了通过Spring官方的构建页面来生成项目&#xff0c;也介绍了通过使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程。在完成了基础项目构建之后&#xff0c;我们要开始进行的就是代码的开发阶段&#x…

神TM的SOTA ,看完谷歌的新论文,我对AI大厂有些失望

源 | 机器之心用数万美元 TPU 算力&#xff0c;实现在 CIFAR-10 上 0.03% 的改进&#xff0c;创造了新的 SOTA&#xff0c;但这一切值得吗&#xff1f;「我相信他们得到的数字是准确的&#xff0c;他们确实做了工作并得到了结果…… 但这样真的好吗&#xff1f;」一名机器学习研…

Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由

转载自公众号&#xff1a;工匠小猪猪的技术世界 摘要: 本文非原创&#xff0c;是笔者搜集了一些HikariCP相关的资料整理给大家的介绍&#xff0c;主要讲解了为什么sb2选择了HikariCP以及HikariCP为什么这么快。 Springboot2默认数据库连接池选择了HikariCP为何选择HikariCP理由…

剑指Offer - 面试题13. 机器人的运动范围(BFS/DFS)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入…

聊聊“润(run)”

文 | One day知乎大家好&#xff0c;我是one day。前不久&#xff0c;我和知乎大V陈然老师在广州的台风天上午&#xff0c;线上聊了一杯咖啡时间的天&#xff0c;老师帮忙解答了一些疑虑&#xff0c;share了一些自己的想法。主要是围绕 美国湾区互联网工作氛围、大厂&创业公…

Spring Boot使用@Async实现异步调用:使用Future以及定义超时

之前连续写了几篇关于使用Async实现异步调用的内容&#xff0c;也得到不少童鞋的反馈&#xff0c;其中问题比较多的就是关于返回Future的使用方法以及对异步执行的超时控制&#xff0c;所以这篇就来一起讲讲这两个问题的处理。 如果您对于Async注解的使用还不了解的话&#xf…

《程序员面试金典》解题目录(更新完毕)

题目来源于LeetCode上的《程序员面试金典》&#xff0c;这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《剑指Offer》解题目录、LintCode代码能力测试CAT 解题目录可点击链接查看。updated on 2020.4.17 不懂的概念可以参考《数据结构与算法之美》学习汇总 已解…

我竟在一篇AI顶会论文里见到了小猪佩奇...

声明&#xff1a;本文原创首发于公众号夕小瑶的卖萌屋。作者&#xff1a;智商掉了一地--->【我是传送门】&#xff0c;内含海量CV/NLP/ML入门资料、必刷综述、前沿论文解读、交流社群、offer神器、学习神器等在介绍接下来的内容前&#xff0c;我们先来看一则笑话&#xff1a…