Spring1.x时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
Spring2.x时代 随着JDK 1.5带来的注解支持,Spring2.x可以使用注解对Bean进行声明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。
那么,问题来了,究竟是应该使用xml还是注解呢?
最佳实践:
1、 应用的基本配置用xml,比如:数据源、资源文件等;
2、 业务开发用注解,比如:Service中注入bean等;
Spring3.x到Spring4.x到Spring5.x 从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处于这个时代,并且Spring4.x和Springboot都推荐使用java配置的方式
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置。
@Configuration和@BeanSpring的Java配置方式是通过@Configuration 和 @Bean这两个注解实现的:
1、@Configuration作用于类上,相当于一个xml配置文件;
2、@Bean作用于方法上,相当于xml配置中的
什么是SpringBoot
随着动态语言的流行 (Ruby、Groovy、Scala、Node.js),
Java 的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,Spring Boot 应运而生。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速的运行起来。使用 Spring Boot 很容易创建一个独立运行(运行 Jar,内嵌 Servlet 容器)准生产级别的基于 Spring 框架的项目,使用 Spring Boot 你可以不用或者只需很少的 Spring 配置。
其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,Spring Boot 是一个服 务于框架的框架。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
Spring Boot的优点
快速构建项目
对主流开发框架的无配置集成
项目可独立运行,无需外部依赖 Servlet 容器
提供运行时的应用监控
极大地提高了开发、部署效率
与云计算的天然集成
Spring Boot的核心特点
微服务:使用Spring Boot可以生成独立的微服务功能单元
自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置
起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
单体应用与微服务 单体应用是把所有的应用模块都写在一个应用中,导致项目越写越大,模块之间的耦合度也会越来越高。 微服务是一种架构风格,用微服务可以将应用的模块单独部署,对不同的模块进行不同的管理操作,不同的模块生成小型服务,每个功能元素最后都可以成为一个可以独立替换、独立升级的功能单元,各个小型服务之间通过http/rpc进行通信。
Spring Boot的缺点
版本迭代速度很快,一些模块改动很大
由于不用自己做配置,报错时很难定位
1、利用 IDEA工具 或eclipse[插件]完成创建
(创建时,选中Web。让其支持Web操作访问)
2、编写controller完成运行
3、运行
目录结构
org.springframework.boot spring-boot-starter-parent 2.3.0.RELEASE ...... org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin
Starter pom(参考手册13.4)
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合。你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符。例如,如果你想使用Spring和JPA进行数据库访问,只需要在你的项目中包含spring-boot-starter-data-jpa依赖,然后你就可以开始了。
@SpringBootApplication
SpringBoot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。
/** 1、程序从main方法开始运行 2、使用SpringApplication.run()加载主程序类 3、主程序类需要标注:@SpringBootApplication注解 4、程序启动扫描加载主程序类所在的包 */ @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); }
@SpringBootApplication注解是SpringBoot的核心注解,它其实是一个组合注解:
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootConfiguration:
这是SpringBoot项目的配置注解。进入查看:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
Java之四大元注解@Target、@Retention、@Documented、@Inherited 元注解定义:用于注解【注释】的注解就叫做元注解 1.@Target :用于描述注解的使用范围,也就是说使用了@Target去定义一个注解,那么可以决定定义好的注解能用在什么地方 2.@Retention:用于描述注解的生命周期,也就是说这个注解在什么范围内有效,注解的生命周期和三个阶段有关:源代码阶段、CLASS文件中有效、运行时有效,故其取值也就三个值,分别代表着三个阶段 3.@Documented:表示该注解是否可以生成到 API文档中。在该注解使用后,如果导出API文档,会将该注解相关的信息可以被例如javadoc此类的工具文档化。 注意:Documented是一个标记注解,没有成员。 4.@Inherited:使用@Inherited定义的注解具备继承性 假设一个注解在定义时,使用了@Inherited,然后该注解在一个类上使用,如果这个类有子类,那么通过反射我们可以从类的子类上获取到同样的注解
在Spring Boot项目中推荐使用@SpringBootConfiguration替代@Configuration # 是@Configuration注解的派生注解。功能一致。标注这个类是一个配置类。 # 区别:@Configuration是Spring的注解。目的:解藕。
@EnableAutoConfiguration:
启用自动配置,该注解会让SpringBoot根据项目中依赖的jar包自动配置项目的配置项: 如:我们添加了spring-boot-starter-web的依赖,项目中也就会引入SpringMVC的依赖,SpringBoot就会自动配置tomcat和SpringMVC
@AutoConfigurationPackage #作用是将 添加该注解的类所在的package 作为 自动配置package 进行管理。 #自动注入主类下所在包下所有加了注解(@Controller/@Service...)及配置类(@Configuration)等。 @Import#导入类 # 1 直接导入普通类 # 2 导入实现了ImportSelector接口的类 # 3 导入实现了ImportBeanDefinitionRegistrat接口的类
xxxAutoConfiguration
SpringBoot中存在大量的类,这些类的作用就是帮助我们进行自动配置。 这些自动配置类就是SpringBoot进行自动配置的核心。
关闭自动配置
通过上述,我们得知,SpringBoot会根据项目中的jar包依赖,自动做出配置,SpringBoot支持的自动配置如(非常多):
如果发现应用了不想要的自动配置类,可以使用@EnableAutoConfiguration 或@SpringBootApplication 来禁用 @EnableAutoConfiguration禁用配置:
@SpringBootApplication 禁用配置:
@ComponentScan:
组件扫描器,可自动发现和装配一些Bean
(默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。)
1、普通banner
需要在src/main/resources路径下新建一个banner.txt文件,并在banner.txt中填写好你需要打印的文件即可。
banner.txt
________ .__ .__ / _____/ __ __ ______ _ __ ____ |__|__ __|__| ____ / \ ___| | \/ _ \ \/ \/ // __ \| \ \/ / |/ \ \ \_\ \ | ( <_> ) /\ ___/| |> <| | | \ \______ /____/ \____/ \/\_/ \___ >__/__/\_ \__|___| / \/ \/ \/ \/
参考地址: http://www.network-science.de/ascii/ (将文字转成文本文件)
http://www.degraeve.com/img2txt.php (将图片转成文本文件)
https://www.asciiworld.com/ (最全的asciiworld)
2、自定义颜色
Spring Boot提供了一个枚举类[AnsiColor
],这个类可以控制banner.txt
中的字符颜色,而且非常容易使用。
${AnsiColor.BRIGHT_RED} :设置控制台中输出内容的颜色 ${application.version} :用来获取MANIFEST.MF 文件中的版本号 ${application.formatted-version} :格式化后的${application.version} 版本信息 ${spring-boot.version} :Spring Boot的版本号 ${spring-boot.formatted-version} :格式化后的${spring-boot.version} 版本信息
把以上信息通过${}
放入banner.txt
中,就会打印出项目对应的信息。
3、动态Banner
SpringBoot 2.0后加入了动态Banner的方式
只需要将对应的gif的图片放到src/main/resources即可。[banner.gif]
4、解析:
发现 Springboot 可以把图片转换成 ASCII 图案,流程如下:
获取图片。
遍历图片像素点。
分析像素点,每个像素点根据颜色深度得出一个值,根据明暗度匹配不同的字符。
输出图案。
/** 位置:org.springframework.boot.SpringApplicationBannerPrinter */
5、Spring Boot默认寻找 :
默认寻找 Banner 的顺序是
依次在 Classpath 下找 文件 banner.gif , banner.jpg , 和 banner.png , 先找到谁就用谁。
继续 Classpath 下找 banner.txt
上面都没有找到的话, 用默认的 SpringBootBanner 。
如下详细配置
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#core-properties
spring.banner.charset |
UTF-8 |
横幅文件编码。 |
---|---|---|
spring.banner.image.height |
字符中的横幅图像的高度(默认基于图像高度)。 | |
spring.banner.image.invert |
false |
是否应针对暗终端主题反转图像。 |
spring.banner.image.location |
classpath:banner.gif |
横幅图像文件位置(也可以使用jpg或png)。 |
spring.banner.image.margin |
2 |
字符中的左手图像边距。 |
spring.banner.image.width |
76 |
字符中的横幅图像的宽度。 |
spring.banner.location |
classpath:banner.txt |
横幅文本资源位置。 |
SpringBoot的核心配置文件用于配置SpringBoot程序。有两种格式的配置文件:
.properties文件 .yml文件
默认情况下会找: bootstrap/application.properties/yml
配置文件的作用:
按需自定义修改SpringBoot自动配置的默认值。
全局配置文件(参考手册23.3)
参考文档: https://docs.spring.io/spring-boot/docs/1.5.12.BUILD-SNAPSHOT/reference/htmlsingle/
SpringApplication将从以下位置加载application.properties文件,并添加到Spring Environment中:
1. 当前目录下的一个/config子目录 2. 当前目录 3. 一个classpath下的/config包 4. classpath根路径(root) 这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)
application.properties示例:
#修改tomcat的端口为8081 server.port=8080 # 上下文的访问路径 server.servlet.context-path=/boot
更多的配置:
参考官方文档:(**目录[X. Appendices**](https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix))
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix
全局配置文件(yml)
YAML文件定义:
YAML(YAML Ain’t Market Language)语言文件,以数据为中心,比json、XML等文件更加适合做配置文件 yml是一种yaml格式的配置文件,主要采用一定的空格、换行等格式排版进行配置。 yml是一种直观的能够被计算机识别的数据序列化格式。容易被人阅读。yaml类似于XML,但是语法比XML简洁很多。 yml后缀也可以使用yaml后缀。
YAML文件的基本语法:
1. 使用缩进表示层级关系 2. 缩进时不允许使用Tab键,只允许使用空格 3. 缩进的空格的数目不重要,只要相同层级的元素左对齐即可 4. 大小写敏感
YAML的值的写法:
1. k: v:字面直接来写; 2. 字符串默认不用加上单引号或者双引号; 3. "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思 4. name: "zhangsan \n lisi":输出;zhangsan 换行 lisi 5. '':单引号;会转义特殊字符,特殊字符终只是一个普通的字符串数据 6. name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi (4) YAML支持三种数据格式:对象,数组,基本数据类型
示例:
server: port: 8080 #服务的端口号 servlet: context-path: /boot #上下文环境
备注(加载顺序):
同一级目录下,如果有相同的application.properties 和application.yml文件时,优先级引用properties文件。同时属性的优先级以先声明的为准。后面不会进行覆盖。
使用配置文件注入属性
Springboot占位符支持的有随机数和配置的值等
官方提供
org.springframework.boot.env.RandomValuePropertySource
${random.value} ${random.int} ${random.long} ${random.int(10)} ${random.int[1024,1233]} ${random.uuid}
自定义配置数值
server: port: 9099 app: name: wpc tel: 18012345678
获取值方式
注解@Value(value=”${app.name}”)就可以绑定到你想要的属性上面。
使用配置文件注入属性
@ConfigurationProperties
定义一个类
/** * @Classname PropertiesConfig * @Author guoweixin * @Description TODO * @Created by Administrator */ @Configuration @ConfigurationProperties(prefix = "java") public class PropertiesConfig { /**为如下属性声明 get/set方法*/ private String name; private String version; @Bean public PropertiesBean propertiesBean(){ System.out.println(name); System.out.println(version); return new PropertiesBean(); }
application.yml
java: name: ch1-exam version: 1.8
在此种场景下,当Bean被实例化时,@ConfigurationProperties会将对应前缀的后面的属性与Bean对象的属性匹配。符合条件则进行赋值。
Xml配置文件
SpringBoot提供零配置,即无XML配置。但是在实际项目中,可能有一些特殊要求你必须使用XML配置,这时我们可以通过Spring提供@ImportResource来加载XML配置。 例如:(在类上方) @ImportResource(value = {"classpath:demo.xml"})
bootstrap配置文件
SpringBoot中有以下两种配置文件bootstrap (.yml 或者 .properties),application (.yml 或者 .properties)
bootstrap.yml 和application.yml 都可以用来配置参数。主要用于 Spring Boot 项目的自动化配置
区别描述:
#1.加载顺序上的区别
bootstrap.yml(bootstrap.properties)先加载 application.yml(application.properties)后加载
在 Spring Boot 中有两种上下文,一种是 bootstrap(用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载), 另外一种是 application。 bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
#2.bootstrap/ application 的应用场景。
bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。 application 配置文件可以用来定义应用级别的,主要用于 Spring Boot 项目的自动化配置。
#3. bootstrap 配置文件有以下几个应用场景。
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息; 一些固定的不能被覆盖的属性 一些加密/解密的场景;
SpringBoot本身并不支持bootstrap.properties文件,需要和Spring Cloud 的组件结合——只有加上Spring Cloud Context依赖才能生效。
org.springframework.cloud spring-cloud-context
简介
SpringBoot对各种日志框架都做了支持,默认帮我们支持了slf4j.jar和logback的实现。
如果不需要更改为其他日志系统如Log4j2等,则无需多余的配置,LogBack默认将日志打印到控制台上。
如果要使用LogBack,原则上是需要添加dependency依赖的org.springframework.boot spring-boot-starter-logging
但是因为新建的Spring Boot项目一般都会引用spring-boot-starter
或者spring-boot-starter-web
,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging
的依赖,所以,无需额外添加依赖。
private static final Logger log= LoggerFactory.getLogger(UserController.class); @RequestMapping("hello") public String hello(){ log.trace("跟踪级别--"); log.debug("==Bug级别--"); log.info("Info"); log.warn("warn.."); log.error("error..级别"); return "我的第一个 SpringBoot HelloWolrd" ; } }
级别控制
日志的级别是由低到高。级别从高到低: ERROR
, WARN
, INFO
, DEBUG
, TRACE
日志的显示内容会在当前级别后的高级别生效显示。 SpringBoot默认的日志级别为info级别。我们可以通过配置来修改默认的日志的配置(控制台)
格式为: 'logging.level.* = LEVEL' logging.level :日志级别控制前缀,*为包名或Logger名 LEVEL :选项 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF 举例: logging.level.com.wpc=DEBUG #com.wpc包下所有class以DEBUG级别输出 logging.level.root=WARN # root日志以WARN级别输出
# 设置日志级别 logging: level: com.wpc.web.controller: error com.wpc.service.impl: info #对指定包级别进行设定
文件输出(旧版本)
如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。
logging.file | logging.path | 示例 | 描述 |
---|---|---|---|
none | none | 只在控制台输出 | |
指定文件名 | none | Log.log | 输出到log.log文件 |
none | 指定目录 | Log/log.log | 输出到指定目录下 |
· logging.file,设置文件或目录,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
· logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log
注:二者不能同时使用,如若同时使用,则只有logging.file
生效
# 设置日志级别 logging: level: com.wpc: trace #对指定包级别进行设定 file: log/my.log #设定日志文件
默认情况下,日志文件的大小达到 10MB 时会切分一次,产生新的日志文件,默认级别为: ERROR、WARN、INFO
文件输出(最新版本)
mvn package 即可看到效果
logging: file: name: log/my.log
定制日志格式
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载: Logback: logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy Log4j: log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml Log4j2: log4j2-spring.xml, log4j2.xml JDK (Java Util Logging): logging.properties Spring Boot 官方推荐优先使用带有 -spring 的文件名作为你的日志配置(如使用 logback-spring.xml ,而不是 logback.xml ),命名为 logback-spring.xml 的日志配置文件, spring boot 可以为它添加一些 spring boot 特有的配置项(下面会提到)。
application.yml
logging: config: classpath:logback-spring.xml
logback-spring.xml
logback info ${CONSOLE_LOG_PATTERN} UTF-8 ${log.path}/log_debug.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log 100MB 15 debug ACCEPT DENY ${log.path}/log_info.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log 100MB 15 info ACCEPT DENY ${log.path}/log_warn.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log 100MB 15 warn ACCEPT DENY ${log.path}/log_error.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log 100MB 15 ERROR ACCEPT DENY
在实际开发中,我们修改某处代码逻辑功能或页面都需要重启应用服务器,这无形中降低了开发效率。 热部署是指当我们修改代码后,服务能自动重启加载新修改的内容,这样大大提高了我们开发的效率: SpringBoot 官方提供了热部署功能:
org.springframework.boot spring-boot-devtools true
注意以上的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟)
yml文件中如果出现中文注释乱码,可在此解决:
https://www.cnblogs.com/ambitionutil/p/11245312.html
导入依赖jar
org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine
测试类
@RunWith(SpringRunner.class) //是告知JAVA环境 这个类通过用什么运行环境运行。启动和创建均是(spring的应用上下文) @SpringBootTest class ApplicationTests { @Autowired DemoService demoService; @Test void contextLoads() { ...... } }