原文地址:https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#using-boot-structuring-your-code



关于默认包的问题

java 中,如果我们把一个 java 类,不放到特定包里面,则默认放到 默认包 里面,在使用 Spring Boot 的时候,要避免这样做,因为这样做,会导致使用 @ComponentScan, @EntityScan, or @SpringBootApplication 注解出现一些问题;


加载启动类

Spring Boot 建议我们将,启动类,放在所有类之上,根包下面,因为启动类上面的 @SpringBootApplication 注解,有个隐式的扫描包的动作,它会扫描他所在包下面的所以包,这样就省去我们使用 @ComponentScan 注解进行手动扫描了;

官网建议我们包格式如下:

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

可以看到启动类 Application.java 在所有类的上面;

如果不想使用 @SpringBootApplication 可以使用 @EnableAutoConfiguration and @ComponentScan 两个注解替换,完成一样的效果;

@EnableAutoConfiguration
@ComponentScan(value = "hello")
// @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

配置

  • 基于 java

    Spring Boot 里面,推荐使用基于 java 类的配置,而不去使用基于 xml 的配置,杜绝任何 xml 文件的产生;

    官网建议的做法是:创建一个单例的 java 类,使用 @Configuration 标识为配置类,该类里面进行各种配置,因为 Spring Boot 支持基于 java 的配置 ;

    但是不需要将所有的配置,都放在一个 java 里面,可以使用 @Import 注解导入其他配置类,或者使用 @ComponentScan 注解,扫描所有的类,这样也就自动的导入了配置类;

  • 导入 xml 文件

    如果项目必须使用到 xml 文件,官方依然建议先创建一个配置类,进行其他配置,然后使用注解 @ImportResource 导入 xml 文件的配置 ;

  • 自动配置(Auto-configuration

    Spring Boot 会自动配置依赖,根据你在 pom 文件里面配置的依赖,你只需要将注解 @EnableAutoConfiguration或@SpringBootApplication 配置到任何一个配置类上,即可获得 Auto-configuration 的功能 ;

    自动配置是非侵入性的;比如你添加了数据源的依赖,则自动配置,会在你没有配置数据源实例的时候,进行自动配置,一旦你自己配置了,则自动配置将取消之前的配置;

    还可以禁止某些配置的自动配置,在配置上使用注解 @EnableAutoConfiguration

    import org.springframework.boot.autoconfigure.*;
    import org.springframework.boot.autoconfigure.jdbc.*;
    import org.springframework.context.annotation.*; @Configuration
    @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
    public class MyConfiguration {
    }

    如果要禁止的类不在类路径下面,则使用 excludeName 值为类的全限定名来替换掉 exclude


Bean管理和依赖注入

官方建议使用 @ComponentScan 扫描 beans,然后使用 @Autowired 进行属性的注入 ;

如果我们按照上面我说的 加载启动类 那样做。则我们可以直接使用不带参数的@ComponentScan 所有应用程序组件(@ Component,@ Service,@ Repository,@ Controller等),注册 Beans ;

就像下面这样,直接使用 @Service 创建一个 service 层 的 bean ,而不用带任何参数:

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; @Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
} // ... }

如果 bean 只有一个构造器,则 @Autowired 可以被省略:

@Service
public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
} // ... }

@SpringBootApplication

一个 @SpringBootApplication 相当于下面三个注解:

  1. @EnableAutoConfiguration 根据依赖项自动配置项目
  2. @ComponentScan 可以扫描本身所在包及其子包
  3. @Configuration 配置类

Developer Tools

开发者工具;Spring Boot 还提供了一额外的工具包,提供一些开发时可能需要的功能,可以添加到 Maven 依赖里面:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

上述配置中的 optional 置为 true ,使得开发者工具,仅仅在开发环境中可以使用,也就是打成 jar 包的时候,将自动的被禁用;


关于 Developer Tools 的一些细节

  1. 缓存问题

    Sping Boot 支持一些库使用缓存功能;比如:模板引擎,会缓存已经编译过的模板,以避免重复解析模板文件;SpringMvc 提供静态资源的时候,可以设置 Http 缓存头 ;

    但是缓存功能,可能会导致新的页面无法里面被访问,因此,spring-boot-devtools 工具包,默认禁用缓存选项;

    缓存配置(包括下面的配置),通常在 application.properties 文件里面配置,spring-boot-devtools 不需要手动去设置这些属性,只会自适应application.properties 等配置文件的配置 ;

  2. 日志级别

    还可以打印出 Web 请求的详细信息,只需要将 spring.http.log-request-details 置为 true,否则默认是不打印详细信息的;

  3. 自动重启

    使用了工具包以后,将会监测类路径上的文件,一旦有文件发生改变,则自动重启项目,以及时得到修改反馈,在 IDEA 中,更改完资源以后,需要 build 一下,以更新类路径下文件,触发自动重启 ;

    当决定类路径上的条目是否应该在更改时触发重新启动时,DevTools会自动忽略名为spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的项目。

  4. 排除资源

    一些资源改动,我们整个项目重启,比如只是改变了模板元素这些,我们更希望的是,仅仅重新加载我们改动的,其他的不要重新加载 ;

    默认情况下 /META-INF/maven,/META-INF/resources,/resources,/static,/public,或 /templates 下面的资源改动,不会引起重启,只会引起局部重新加载;

    如果要自定义这些排除项,这样默认的排除项就没了:

    spring.devtools.restart.exclude=static/**,public/**

    如果想保留默认的排除项,再继续添加新的排除项,使用:

    spring.devtools.restart.additional-exclude=static/**,public/**
  5. 其他触发重启路径

    使用注解 spring.devtools.restart.additional-paths 配置;

  6. 禁用重启

    如果想禁用重启,则配置 spring.devtools.restart.enabledfalse ,但是这样做,还是会初始化重新启动的类加载器,只是不会监视文件更改;

    在某些情况下,需要完全禁用,让它得不到加载,因为某些库不能与重新加载的类加载器一起使用,这时候需要这样做:

    public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
    }
  7. 使用触发器文件

    仅针对特定文件的修改,才触发重启;使用 spring.devtools.restart.trigger-file 配置下特定文件的路径地址 ;

    实现了序列化接口对象的改动,不会触发重启 ;


(四)Spring Boot官网文档学习的更多相关文章

  1. (五)Spring Boot官网文档学习

    文章目录 SpringApplication SpringApplication 事件 `ApplicationContext ` 类型 访问传递给 `SpringApplication` 的参数 A ...

  2. (三)Spring Boot 官网文档学习之默认配置

    文章目录 继承 `spring-boot-starter-parent` 覆盖默认配置 启动器 原文地址:https://docs.spring.io/spring-boot/docs/2.1.3.R ...

  3. (二)Spring Boot 官网文档学习之入门

    文章目录 Spring Boot 是什么 系统要求 Servlet 容器 Maven方式安装Spring Boot 编写第一个 Spring Boot 项目 原文:https://docs.sprin ...

  4. Spring Security 官网文档学习

    文章目录 通过`maven`向普通的`WEB`项目中引入`spring security` 配置 `spring security` `configure(HttpSecurity)` 方法 自定义U ...

  5. Spring3.0官网文档学习笔记(四)--3.1~3.2.3

    3.1 Spring IoC容器与Beans简单介绍     BeanFactory接口提供对随意对象的配置:     ApplicationContext是BeanFactory的子接口.整合了Sp ...

  6. Spring3.0官网文档学习笔记(二)

    1.3 使用场景 典型的成熟的spring web应用 spring使用第三方框架作为中间层 远程使用场景 EJB包装 1.3.1 依赖管理.命名规则(包)     spring-*.jar *号代表 ...

  7. Spring3.0官网文档学习笔记(八)--3.4.3~3.4.6

    3.4.3 使用depends-on     使用depends-on能够强制使一个或多个beans先初始化,之后再对这个bean进行初始化. 多个bean之间用","." ...

  8. Spring3.0官网文档学习笔记(一)

    Part 1 Spring框架概述 Spring是模块化的,在应用中仅仅须要引入你所须要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web ser ...

  9. Spring3.0官网文档学习笔记(七)--3.4.2

    3.4.2 依赖与配置的细节     3.4.2.1  Straight values (primitives, Strings, and so on)     JavaBeans PropertyE ...

随机推荐

  1. mpvue开发坑点总结

    最近一直在开发微信小程序,趁着空闲时间总结下使用情况. 现在项目目前使用的是 mpvue:^1.0.11 版本,后续看看更新情况. 文档在此: http://mpvue.com/mpvue/#_2 # ...

  2. 微信小程序 图片设置为圆形

    要图片圆形显示,需要设置border-radius:50%,还要设置overflow:hidden,具体如下: Tip:user-avatar是图片控件的class .user-avatar { wi ...

  3. SpringMVC处理请求释放静态资源的三种方式

    方式一 在SpringMVC的配置文件中添加如下语句 <mvc:default-servlet-handler/> 说明:当SpringMVC前端控制器对静态资源进行拦截后,在通过处理器映 ...

  4. bugku web所有writeup_超详细讲解_持续更新

    首先说一下我的主用工具,在windows下,主要是用这些,用到其他特定的工具会在题里说. 0.浏览器:火狐,配合Max hackbar插件 (这个是免费的) 1.抓包改包:burpsuite.http ...

  5. windows下使用xortools

    xortool是一个多字节异或加密破解工具.作者只是适配了linux版,在Windows下使用会导致保存文件错误,因为Windows会把\n转成\r\n,加密和解密都乱了.而且命令还和readme不一 ...

  6. vue入门|ElementUI使用指南

    vue入门|ElementUI使用指南 1.开发前务必熟悉的文档: vue.js2.0中文,项目所使用的js框架 vue-router,vue.js配套路由 vuex 状态管理 Element UI框 ...

  7. 多层If语句 和 表格驱动 的对比

    网文提到表格驱动,总喜欢拿一层if做例子,然而这样未免也太简单. 下文是三层缩进的if和表驱动比较,大家可自行判断优劣. 业务是这样的,某景点分旺季票价和淡季票价,淡季票为旺季的一半,15岁以下孩子再 ...

  8. 【Java.Regex】用正则表达式查找Java源文件中的注释

    代码: package regex; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.I ...

  9. 100-continue

    https://wiki.open.qq.com/wiki/技术优化原则#1._.E7.A8.8B.E5.BA.8F.E8.AE.BE.E8.AE.A1.E6.97.B6.E9.9C.80.E8.A6 ...

  10. MyBatis:MyBatis操作MySQL存储过程

    一 . 数据库中创建存储过程,并查看创建结果 1.创建存储过程 DROP procedure IF EXISTS net_procedure_request; DELIMITER $$ )) BEGI ...