(四)Spring Boot官网文档学习
关于默认包的问题
在 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的功能 ;自动配置是非侵入性的;比如你添加了数据源的依赖,则自动配置,会在你没有配置数据源实例的时候,进行自动配置,一旦你自己配置了,则自动配置将取消之前的配置;
还可以禁止某些配置的自动配置,在配置上使用注解
@EnableAutoConfigurationimport 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 相当于下面三个注解:
@EnableAutoConfiguration根据依赖项自动配置项目@ComponentScan可以扫描本身所在包及其子包@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 的一些细节
缓存问题
Sping Boot支持一些库使用缓存功能;比如:模板引擎,会缓存已经编译过的模板,以避免重复解析模板文件;SpringMvc提供静态资源的时候,可以设置Http缓存头 ;但是缓存功能,可能会导致新的页面无法里面被访问,因此,
spring-boot-devtools工具包,默认禁用缓存选项;缓存配置(包括下面的配置),通常在
application.properties文件里面配置,spring-boot-devtools不需要手动去设置这些属性,只会自适应application.properties等配置文件的配置 ;日志级别
还可以打印出
Web请求的详细信息,只需要将spring.http.log-request-details置为true,否则默认是不打印详细信息的;自动重启
使用了工具包以后,将会监测类路径上的文件,一旦有文件发生改变,则自动重启项目,以及时得到修改反馈,在
IDEA中,更改完资源以后,需要build一下,以更新类路径下文件,触发自动重启 ;当决定类路径上的条目是否应该在更改时触发重新启动时,
DevTools会自动忽略名为spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的项目。排除资源
一些资源改动,我们整个项目重启,比如只是改变了模板元素这些,我们更希望的是,仅仅重新加载我们改动的,其他的不要重新加载 ;
默认情况下
/META-INF/maven,/META-INF/resources,/resources,/static,/public,或 /templates下面的资源改动,不会引起重启,只会引起局部重新加载;如果要自定义这些排除项,这样默认的排除项就没了:
spring.devtools.restart.exclude=static/**,public/**
如果想保留默认的排除项,再继续添加新的排除项,使用:
spring.devtools.restart.additional-exclude=static/**,public/**
其他触发重启路径
使用注解
spring.devtools.restart.additional-paths配置;禁用重启
如果想禁用重启,则配置
spring.devtools.restart.enabled为false,但是这样做,还是会初始化重新启动的类加载器,只是不会监视文件更改;在某些情况下,需要完全禁用,让它得不到加载,因为某些库不能与重新加载的类加载器一起使用,这时候需要这样做:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
使用触发器文件
仅针对特定文件的修改,才触发重启;使用
spring.devtools.restart.trigger-file配置下特定文件的路径地址 ;实现了序列化接口对象的改动,不会触发重启 ;
(四)Spring Boot官网文档学习的更多相关文章
- (五)Spring Boot官网文档学习
文章目录 SpringApplication SpringApplication 事件 `ApplicationContext ` 类型 访问传递给 `SpringApplication` 的参数 A ...
- (三)Spring Boot 官网文档学习之默认配置
文章目录 继承 `spring-boot-starter-parent` 覆盖默认配置 启动器 原文地址:https://docs.spring.io/spring-boot/docs/2.1.3.R ...
- (二)Spring Boot 官网文档学习之入门
文章目录 Spring Boot 是什么 系统要求 Servlet 容器 Maven方式安装Spring Boot 编写第一个 Spring Boot 项目 原文:https://docs.sprin ...
- Spring Security 官网文档学习
文章目录 通过`maven`向普通的`WEB`项目中引入`spring security` 配置 `spring security` `configure(HttpSecurity)` 方法 自定义U ...
- Spring3.0官网文档学习笔记(四)--3.1~3.2.3
3.1 Spring IoC容器与Beans简单介绍 BeanFactory接口提供对随意对象的配置: ApplicationContext是BeanFactory的子接口.整合了Sp ...
- Spring3.0官网文档学习笔记(二)
1.3 使用场景 典型的成熟的spring web应用 spring使用第三方框架作为中间层 远程使用场景 EJB包装 1.3.1 依赖管理.命名规则(包) spring-*.jar *号代表 ...
- Spring3.0官网文档学习笔记(八)--3.4.3~3.4.6
3.4.3 使用depends-on 使用depends-on能够强制使一个或多个beans先初始化,之后再对这个bean进行初始化. 多个bean之间用","." ...
- Spring3.0官网文档学习笔记(一)
Part 1 Spring框架概述 Spring是模块化的,在应用中仅仅须要引入你所须要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web ser ...
- Spring3.0官网文档学习笔记(七)--3.4.2
3.4.2 依赖与配置的细节 3.4.2.1 Straight values (primitives, Strings, and so on) JavaBeans PropertyE ...
随机推荐
- HDU 6086 Rikka with String ——(AC自动机 + DP)
这是一个AC自动机+dp的问题,在中间的串的处理可以枚举中断点来插入自动机内来实现,具体参见代码. 在这题上不止为何一直MLE,一直找不到结果(lyf相同写法的代码消耗内存较少),还好考虑到这题节点应 ...
- tecplot不能导入fluent多面体的解决办法
多面体网格在fluent当中计算完成,如果保存cas和dat文件,如果直接将cas和dat文件导入tecplot进行后处理,tecplot会提示多面体网格在fluent当中计算完成,如果保存cas和d ...
- 解释一下 Flux
Flux 是一种强制单向数据流的架构模式.它控制派生数据,并使用具有所有数据权限的中心 store 实现多个组件之间的通信.整个应用中的数据更新必须只能在此处进行. Flux 为应用提供稳定性并减少运 ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战
笔记 4.Redis工具类封装讲解和实战 简介:高效开发方式 Redis工具类封装讲解和实战 1.常用客户端 https://redisdesktop.com/download ...
- IMDB-WIKI – 500k+ face images with age and gender labels论文学习
DEX: Deep EXpectation of apparent age from a single image 这个论文我们使用深度学习解决了在静态人脸图像中面部年龄的估计.我们的卷积神经网络使用 ...
- ROS tf广播编写
博客参考:https://www.ncnynl.com/archives/201702/1310.html ROS与C++入门教程-tf-编写tf broadcaster(广播) 说明: 介绍如何广播 ...
- shiro解决一个账号异地登录的问题
如下,找到session中的信息删除即可,按照这个方式试了下.基本可用 在多台服务器部署时,前提必须实现session共享. /** * 登录认证 * @param token * @return * ...
- Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 (1).KVM虚拟机克隆 KVM虚拟克隆命令virt-clone [选项] 常用选项 ...
- Python - Django - 在 CBV 中使用装饰器
urls.py: from django.conf.urls import url from app02 import views urlpatterns = [ # app02 url(r'^app ...
- html如何修改hr水平直线的粗细
hr是常见的超文本标签,是一条水平直线,要设置该直线变粗一些.可以先把hr本身的border隐藏掉,然后设置border-top-width,也就是只留上边框,如图:hr的默认高度height是0,所 ...