SpringBoot2 系列往期回顾:


spring boot 对于工程代码结构并没有特殊的要求,正常来说是可以对代码结构进行任意布局的。但是呢,“约定大于配置”,如果想要按照 springboot 的默认套路来,肯定是需要遵守一些潜在的约定的。接下来这篇就介绍 springboot 提供的关于代码结构的 2点 最佳实践建议,主要参考:14. Structuring Your Code

1、避免使用 default 包

  没有 package 声明的类被认为是在 default 包中。通常不建议而且应该避免 default 包default 包对于使用 @ComponentScan@EntityScan@SpringBootApplication 注解的 Spring Boot 应用来说,可能会导致一些问题,因为每个 jar 中的每个类可能都会被读取(不指定扫描的 package 路径的话,spring boot 默认从这些有注解的类所属的 package 进行扫描,这里的 default 包变成了所有代码的根路径)。

  注:对于包命名,建议使用 Java 推荐的反向域名命名约定,例如:com.example.project,像 springboot 用的则是 org.springframework.boot

2、主类 ( main application class ) 放置在root package

  通常建议将主类( main application class ,含有 main 方法的类)放置在其他类之上的 根package (root package)下,而且 @SpringBootApplication 注解也通常声明在主类上,它隐式地为某些项定义了基本的“搜索包”(search package,默认的 scan 路径)。例如在写 JPA 应用时,有 @SpringBootApplication 注解的类所属的 package 将被用于搜索 @Entity ,还有 @Service 等等注解都会进行扫描。使用 root package 允许 component scan 只应用于你的工程,而不会扫描其他的 jar 包。换句话说,就是限定了 scan 的范围从本工程的 root packag 开始,不会对所有 jar 包进行全扫描。

  小技巧:如果不想使用 @SpringBootApplication,可以使用 @EnableAutoConfiguration 和 @ComponentScan 进行代替和指定 scan 哪些 package
  下面的例子演示了一个典型的 spring boot 应用的包布局结构:

com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java

  这里 root package 是 com.example.myapplication, Application.java 中会有 main 函数,同时会有 @SpringBootApplication 注解,默认扫描 com.example.myapplication 下的所有相关注解,配上这个例子应该可以更好地理解上面的内容:

package com.example.myapplication;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

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

  以上便是入手使用 springboot 时关于工程代码结构方面比较推荐的2个最佳实践。

Spring Boot2(005):关于代码结构的更多相关文章

  1. Spring boot 梳理 - 代码结构(Main类的位置)

    Spring boot 对代码结构无特殊要求,但有个套最佳实践的推荐 不要使用没有包名的类.没有包名时,@ComponentScan, @EntityScan, or @SpringBootAppli ...

  2. Spring Boot2(四):使用Spring Boot多数据源实现读写分离

    前言 实际业务场景中,不可能只有一个库,所以就有了分库分表,多数据源的出现.实现了读写分离,主库负责增改删,从库负责查询.这篇文章将实现Spring Boot如何实现多数据源,动态数据源切换,读写分离 ...

  3. Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...

  4. 图书-技术-SpringBoot:《Spring Boot2 + Thymeleaf 企业应用实战》

    ylbtech-图书-技术-SpringBoot:<Spring Boot2 + Thymeleaf 企业应用实战> <Spring Boot 2+Thymeleaf企业应用实战&g ...

  5. Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解

    一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...

  6. Spring Boot2(006):关于配置类(Configuration Classes)和配置(Configuration)

    一.配置类(Configuration Classes) Spring Boot 支持基于 xml 的配置,但更偏向于使用基于 Java 的配置,通常建议使用定义有 main 方法的主 @Config ...

  7. Spring Boot2.x 动态数据源配置

    原文链接: Spring Boot2.x 动态数据源配置 基于 Spring Boot 2.x.Spring Data JPA.druid.mysql 的动态数据源配置Demo,适合用于数据库的读写分 ...

  8. SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本

    1.项目基础 项目是基于Spring Boot2.x版本的 2.添加依赖 <!-- quartz依赖 --> <dependency> <groupId>org.s ...

  9. Spring Boot2.0使用Spring Security

     一.Spring Secutity简介     Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性 ...

随机推荐

  1. 劫后余生--New Start

    被搁置的计划 It was the best of times,it was the worst of times,it was the age of wisidom,it was the age o ...

  2. 使用SourceTree的注意事项

    1.我使用SourceTree时,使用的下面的配置全局忽略: *~ .DS_Store xcuserdata 2. 远程仓库的url路径不要使用域名,而应该使用ip地址.否则会显示“这是一个无效的ur ...

  3. KALI 2017 X64安装到U盘

    KALI 2017 X64安装到U盘启动(作者:黑冰) 此方法为虚拟机方法,自认为成功率很高,已经成功安装过16,32G U盘​,但也不排除有些人用拷碟方法安装这里我仅介绍虚拟机安装方法. ​1.准备 ...

  4. ng -----监听变化($scope.$watch())

    需求:项目组件中遇到改变日期触发方法. 困难:日期组件中不涉及释焦功能 解决:在angularjs中用$scope.$watch() 其中name是字符串,是指监听到的具体对象值.

  5. LCS(Longest Common Subsequence)最长公共子序列

    最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题.这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置 .最长公共子序列问题是 ...

  6. 腾讯2019秋招--小q爬塔(dp)

    小Q爬塔 题目描述: 小Q 正在攀登一座宝塔,这些宝塔很特别.塔总共有 n 层,但是每两层之间的净高却不相同,所以造成了小Q 爬过每层的时间也不同.如果某一层的高度为 x,那么爬过这一层所需的时间也是 ...

  7. 洛谷 P1094 纪念品分类

    刚开始看到这题就确定这题最好先要排序 第一个想法是排好序后先让第一个和从倒数第一个开始相加和如果就  <= w,那么用n除以2或者再加一得出答案,然后发现随便 当w = 110  n = 5序列 ...

  8. 076、Java数组之定义数组

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  9. Python协程理解——基于爬虫举例

    当前代码在工作当中没有太大的含义,但是对于大家理解协程的基础概念是相当有好处的协程最直接的可以理解为程序当中一个没有返回的功能块儿我们之前有学过多线程,所谓的多线程不论是异步并发,还是并发强调的时候将 ...

  10. hostPath Volume【转】

    hostPath Volume 的作用是将 Docker Host 文件系统中已经存在的目录 mount 给 Pod 的容器.大部分应用都不会使用 hostPath Volume,因为这实际上增加了 ...