约定优于配置
Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.
下面是引自官网的一段话,大略是说: Spring Boot 是所有基于 Spring 开发的我的项目的终点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。
约定优于配置(Convention over Configuration),又称按约定编程,是一种软件设计范式。
实质上是说,零碎、类库或框架应该假设正当的默认值,而非要求提供不必要的配置。比如说模型中有一个名为User的类,那么数据库中对应的表就会默认命名为user。只有在偏离这一个约定的时候,例如:想要将该表命名为person,才须要写无关这个名字的配置。
比方平时架构师搭建我的项目就是限度软件开发轻易写代码,制订出一套标准,让开发人员按对立的要求进行开发编码测试之类的,这样就增强了开发效率与审查代码效率。所以说写代码的时候就须要按要求命名,这样对立标准的代码就有良好的可读性与维护性了
约定优于配置简略来了解,就是遵循约定。
SpringBoot概念
Spring优缺点剖析
长处:
Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种绝对简略的办法,通过依赖注入和面向切面编程,用简略的Java对象(Plain Old Java Object,POJO)实现了EJB的性能。
毛病:
尽管Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配 置。Spring 2.5引入了基于注解的组件扫描,这打消了大量针对应用程序本身组件的显式XML配置。Spring 3.0引入 了基于Java的配置,这是一种类型平安的可重构配置形式,能够代替XML。
所有这些配置都代表了开发时的损耗。因为在思考Spring个性配置和解决业务问题之间须要进行思维切换,所以编写配置挤占了编写利用程序逻辑的工夫。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。
除此之外,我的项目的依赖治理也是一件耗时耗力的事件。在环境搭建时,须要剖析要导入哪些库的坐标,而且还须要剖析导入与之有依赖关系的其余库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会重大妨碍我的项目的开发进度。
SpringBoot解决上述spring问题
SpringBoot对上述Spring的毛病进行的改善和优化,基于约定优于配置的思维,能够让开发人员不用在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,肯定水平上缩短了我的项目周期。
起步依赖
起步依赖实质上是一个Maven我的项目对象模型(Project Object Model,POM),定义了对其余库的传递依赖,这些货色加在一起即反对某项性能。简略的说,起步依赖就是将具备某种性能的坐标打包到一起,并提供一些默认的性能。
主动配置
springboot的主动配置,指的是springboot,会主动将一些配置类的bean注册进ioc容器,咱们能够须要的中央应用@autowired或者@resource等注解来应用它。
“主动” 的表现形式就是咱们只须要引咱们想用性能的包,相干的配置咱们齐全不必管,springboot会主动注入这些配置bean,咱们间接应用这些bean即可。
springboot:简略、疾速、不便地搭建我的项目;对支流开发框架的无配置集成;极大进步了开发、部署效率。
SpringBoot 案例实现
案例需要:申请Controller中的办法,并将返回值响应到页面
应用Spring Initializr形式构建Spring Boot我的项目
实质上说,Spring Initializr是一个Web利用,它提供了一个根本的我的项目构造,可能帮忙咱们疾速构建一个根底的Spring Boot我的项目。
Project SDK”用于设置创立我的项目应用的JDK版本,这里,应用之前初始化设置好的JDK版本即可;在“Choose Initializr Service URL(抉择初始化服务地址)”下应用默认的初始化服务地址“https://start.spring.io”进行Spring Boot我的项目创立(留神应用疾速形式创立Spring Boot我的项目时,所在主机须在联网状态下)
Spring Boot我的项目就创立好了。创立好的Spring Boot我的项目构造如图:
应用Spring Initializr形式构建的Spring Boot我的项目会默认生成我的项目启动类、寄存前端动态资源和页面的文件夹、编写我的项目配置的配置文件以及进行我的项目单元测试的测试类。
创立一个用于Web拜访的Controller
com.cyd包下创立名称为controller的包,在该包下创立一个申请解决管制类HelloController,并编写一个申请解决办法 (留神:将我的项目启动类SpringBootDemoApplication挪动到com.cyd包下)
@RestControllerpublic class HelloController { @RequestMapping("/hello") public String hello(){ return "你好 spring Boot"; }}
运行我的项目
运行主程序启动类SpringbootDemoApplication,我的项目启动胜利后,在管制台上会发现Spring Boot我的项目默认启动的端口号为8080,此时,能够在浏览器上拜访“http://localhost:8080/hello”
页面输入的内容是“你好 Spring Boot”,至此,构建Spring Boot我的项目就实现了。
附:解决中文乱码:
解决办法一:
@RequestMapping(produces = "application/json; charset=utf-8")
解决办法二:
#设置响应为utf-8spring.http.encoding.force-response=true
单元测试与热部署
单元测试
开发中,每当实现一个性能接口或业务办法的编写后,通常都会借助单元测试验证该性能是否正确。Spring Boot对我的项目的单元测试提供了很好的反对,在应用时,须要提前在我的项目的pom.xml文件中增加spring-boot-starter-test测试依赖启动器,能够通过相干注解实现单元测试。
演示:
增加spring-boot-starter-test测试依赖启动器
在我的项目的pom.xml文件中增加spring-boot-starter-test测试依赖启动器,示例代码如下 :
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
留神:应用Spring Initializr形式搭建的Spring Boot我的项目,会主动退出spring-boot-starter-test测试依赖启动器,无需再手动增加。
编写单元测试类和测试方法
应用Spring Initializr形式搭建的Spring Boot我的项目,会在src.test.java测试目录下主动创立与我的项目主程序启动类对应的单元测试类
@RunWith(SpringRunner.class) // 测试启动器,并加载Spring Boot测试注解@SpringBootTest // 标记为Spring Boot单元测试类,并加载我的项目的ApplicationContext上下文环境public class SpringbootDemoApplicationTests { @Autowired private HelloController helloController; @Test public void test01() { String demo = helloController.hello(); System.out.println(demo); }}
上述代码中,先应用@Autowired注解注入了HelloController实例对象,而后在test01()办法中调用了HelloController类中对应的申请管制办法hello(),并输入打印后果。
热部署
在开发过程中,通常会对一段业务代码一直地批改测试,在批改之后往往须要重启服务,有些服务须要加载很久能力启动胜利,这种不必要的反复操作极大的升高了程序开发效率。为此,SpringBoot框架专门提供了进行热部署的依赖启动器,用于进行我的项目热部署,而无需手动重启我的项目。
演示:
增加spring-boot-devtools热部署依赖启动器
在Spring Boot我的项目进行热部署测试之前,须要先在我的项目的pom.xml文件中增加spring-boot-devtools热部署依赖启动器。
<!-- 引入热部署依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId></dependency>
因为应用的是IDEA开发工具,增加热部署依赖后可能没有任何成果,接下来还须要针对IDEA开发工具进行热部署相干的性能设置。
IDEA工具热部署设置
抉择IDEA工具界面的【File】->【Settings】选项,关上Compiler面板设置页面
抉择Build下的Compiler选项,在右侧勾选“Build project automatically”选项将我的项目设置为主动编译,单击【Apply】→【OK】按钮保留设置
在我的项目任意页面中应用组合快捷键“Ctrl+Shift+Alt+/”关上Maintenance选项框,选中并关上Registry页面,具体如下图所示:
列表中找到“compiler.automake.allow.when.app.running”,将该选项后的Value值勾选,用于指定IDEA工具在程序运行过程中主动编译,最初单击【Close】按钮实现设置。
全局配置文件
全局配置文件可能对一些默认配置值进行批改。Spring Boot应用一个application.properties或者application.yaml的文件作为全局配置文件,该文件寄存在src/main/resource目录或者类门路的/config,个别会抉择resource目录。接下来,将针对这两种全局配置文件进行解说 :
application.properties配置文件
应用Spring Initializr形式构建Spring Boot我的项目时,会在resource目录下主动生成一个空的application.properties文件,Spring Boot我的项目启动时会主动加载application.properties文件。咱们能够在application.properties文件中定义Spring Boot我的项目的相干属性,当然,这些相干属性能够是零碎属性、环境变量、命令参数等信息,也能够是自定义配置文件名称和地位
server.port=8081spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.config.additional-location=spring.config.location=spring.config.name=application
接下来,通过一个案例对Spring Boot我的项目中application.properties配置文件的具体应用进行解说
演示:
事后筹备了两个实体类文件,后续会演示将application.properties配置文件中的自定义配置属性注入到Person实体类的对应属性中
先在我的项目的com.lagou包下创立一个pojo包,并在该包下创立两个实体类Pet和Person
public class Pet { private String type; private String name; // 省略属性getXX()和setXX()办法 // 省略toString()办法}
@Component //用于将Person类作为Bean注入到Spring容器中@ConfigurationProperties(prefix = "person") //将配置文件中以person结尾的属性注入到该类中public class Person { private int id; //id private String name; //名称 private List hobby; //喜好 private String[] family; //家庭成员 private Map map; private Pet pet; //宠物 // 省略属性getXX()和setXX()办法 // 省略toString()办法}
@ConfigurationProperties(prefix = “person”)注解的作用是将配置文件中以person结尾的属性值通过setXX()办法注入到实体类对应属性中。
@Component注解的作用是将以后注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样能力被@ConfigurationProperties注解进行赋值。
2、关上我的项目的resources目录下的application.properties配置文件,在该配置文件中编写须要对Person类设置的配置属性
person.id=1person.name=tomperson.family=father, motherperson.hobby=吃饭, 睡觉, 打豆豆person.map.k1=v1person.map.k2=v2person.pet.type=dogperson.pet.name=旺财
编写application.properties配置文件时,因为要配置的Person对象属性是咱们自定义的,Spring Boot无奈自动识别,所以不会有任何书写提醒。在理论开发中,为了呈现代码提醒的成果来不便配置,在应用@ConfigurationProperties注解进行配置文件属性值注入时,能够在pom.xml文件中增加一个Spring Boot提供的配置处理器依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional></dependency>
在pom.xml中增加上述配置依赖后,还须要从新运行我的项目启动类或者应用“Ctrl+F9”快捷键(即 Build Project)重构以后Spring Boot我的项目方可失效。
3、查看application.properties配置文件是否正确,同时查看属性配置成果,关上通过IDEA工具创立的我的项目测试类,在该测试类中引入Person实体类Bean,并进行输入测试
@RunWith(SpringRunner.class) // 测试启动器,并加载Spring Boot测试注解@SpringBootTest // 标记为Spring Boot单元测试类,并加载我的项目的ApplicationContext上下文环境class SpringbootDemoApplicationTests { // 配置测试 @Autowired private Person person; @Test void test02() { System.out.println(person); }}
打印后果:
能够看出,测试方法configurationTest()运行胜利,同时正确打印出了Person实体类对象。至此,阐明 application.properties 配置文件属性配置正确,并通过相干注解主动实现了属性注入。
application.yaml配置文件
YAML文件格式是Spring Boot反对的一种JSON超集文件格式,相较于传统的Properties配置文件,YAML文件以数据为外围,是一种更为直观且容易被电脑辨认的数据序列化格局。application.yaml配置文件的工作原理和application.properties是一样的,只不过yaml格局配置文件看起来更简洁一些。
- YAML文件的扩展名能够应用.yml或者.yaml。
- application.yml文件应用 “key:(空格)value”格局配置属性,应用缩进管制层级关系。
这里,针对不同数据类型的属性值,介绍一下YAML
value值为一般数据类型(例如数字、字符串、布尔等)
当YAML配置文件中配置的属性值为一般数据类型时,能够间接配置对应的属性值,同时对于字符串类型的属性值,不须要额定增加引号,示例代码如下:
server: port: 8081 path: /hello
上述代码用于配置server的port和path属性,port和path属于一个级别
value值为数组和单列汇合
当YAML配置文件中配置的属性值为数组或单列汇合类型时,次要有两种书写形式:缩进式写法和行内式写法。
其中,缩进式写法还有两种示意模式,示例代码如下:
person: hobby: - play - read - sleep
或者应用如下示例模式
person: hobby: play, read, sleep
上述代码中,在YAML配置文件中通过两种缩进式写法对person对象的单列汇合(或数组)类型的喜好hobby赋值为play、read和sleep。其中一种模式为“-(空格)属性值”,另一种模式为多个属性值之前加英文逗号分隔(留神,最初一个属性值后不要加逗号)。
行内式写法:
person: hobby: [play,read,sleep]
通过上述示例比照发现,YAML配置文件的行内式写法更加扼要、不便。另外,蕴含属性值的中括号“[]”还能够进一步省略,在进行属性赋值时,程序会主动匹配和校对。
value值为Map汇合和对象
当YAML配置文件中配置的属性值为Map汇合或对象类型时,YAML配置文件格式同样能够分为两种书写形式:缩进式写法和行内式写法。
其中,缩进式写法的示例代码如下:
person: map: k1: v1 k2: v2
对应的行内式写法示例代码如下
person: map: {k1: v1,k2: v2}
在YAML配置文件中,配置的属性值为Map汇合或对象类型时,缩进式写法的模式依照YAML文件格式编写即可,而行内式写法的属性值要用大括号“{}”蕴含。
接下来,在Properties配置文件演示案例根底上,通过配置application.yaml配置文件对Person对象进行赋值,具体应用如下:
#对实体类对象Person进行属性配置person: id: 1 name: tom hobby: [吃饭,睡觉,打豆豆] family: [father,mother] map: {k1: v1,k2: v2} pet: {type: dog,name: 旺财}
配置文件属性值的注入
应用Spring Boot全局配置文件设置属性时:
- 如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot外部会主动扫描并读取这些配置文件中的属性值并笼罩默认属性。
- 如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配置属性方可失效。
Spring Boot反对多种注入配置文件属性的形式,上面来介绍如何应用注解 @ConfigurationProperties和 @Value 注入属性。
应用@ConfigurationProperties注入属性
Spring Boot提供的@ConfigurationProperties注解用来疾速、不便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。假如当初有一个配置文件,如果应用 @ConfigurationProperties 注入配置文件的属性,示例代码如下:
@Component //用于将Person类作为Bean注入到Spring容器中@ConfigurationProperties(prefix = "person") //将配置文件中以person结尾的属性注入到该类中public class Person { private int id; //id private String name; //名称 private List hobby; //喜好 private String[] family; //家庭成员 private Map map; private Pet pet; //宠物 // 省略getXxx()和setXxx()办法}
application.yml配置文件
person: id: 1 name: tom hobby: [吃饭, 睡觉, 打豆豆] family: [father, mother] map: k1: v1 k2: v2 pet: type: dog name: 旺财
上述代码应用@Component和@ConfigurationProperties(prefix = “person”)将配置文件中的每个属性映射到person类组件中。须要留神的是,应用 @ConfigurationProperties。
应用@Value注入属性
@Value注解是Spring框架提供的,用来读取配置文件中的属性值并一一注入到Bean对象的对应属性中,Spring Boot框架从Spring框架中对@Value注解进行了默认继承,所以在Spring Boot框架中还能够应用该注解读取和注入配置文件属性值。
@Componentpublic class Person { @Value("${person.id}") private int id;}
上述代码中,应用@Component和@Value注入Person实体类的id属性。其中,@Value不仅能够将配置文件的属性注入Person的id属性,还能够间接给id属性赋值,这点是@ConfigurationProperties不反对的。
自定义配置
Spring Boot罢黜了我的项目中大部分的手动配置,对于一些特定状况,咱们能够通过批改全局配置文件以适应具体生产环境,能够说,简直所有的配置都能够写在application.peroperties文件中,Spring Boot会主动加载全局配置文件从而罢黜咱们手动加载的懊恼。然而,如果咱们自定义配置文件,Spring Boot是无奈辨认这些配置文件的,此时就须要咱们手动加载。接下来,将针对Spring Boot的自定义配置文件及其加载形式进行解说。
应用@PropertySource加载配置文件
对于这种加载自定义配置文件的需要,能够应用@PropertySource注解联合@Configuration注解配置类的形式来实现。@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保障Spring Boot可能扫描该注解,还须要类上增加@Configuration注解将实体类作为自定义配置类。
当然,如果须要将自定义配置文件中的属性值注入到对应类的属性中,能够应用 @ConfigurationProperties或者@Value注解进行属性值注入。
演示:
(1)关上Spring Boot我的项目的resources目录,在我的项目的类门路下新建一个test.properties自定义配置文件,在该配置文件中编写须要设置的配置属性。
#对实体类对象MyProperties进行属性配置test.id=110test.name=test
(2)在com.cyd.pojo包下新创建一个配置类MyProperties,提供test.properties自定义配置文件中对应的属性,并依据@PropertySource注解的应用进行相干配置
@EnableConfigurationProperties(MyProperties.class) // 开启对应配置类的属性注入性能@ConfigurationProperties(prefix = "test")@PropertySource(value = "classpath:test.properties")@Configurationpublic class MyProperties { private Integer id; private String name; // 此处省略getXxx()和setXxx()办法}
次要是一个自定义配置类,通过相干注解引入了自定义的配置文件,并实现了自定义属性值的注入。针对示例中的几个注解,具体阐明如下
- @Configuration注解示意以后类是一个自定义配置类,并增加为Spring容器的组件,这里也能够应用传统的@Component注解;
- @PropertySource(“classpath:test.properties”)注解指定了自定义配置文件的地位和名称,此示例示意自定义配置文件为classpath类门路下的test.properties文件;
- @ConfigurationProperties(prefix = “test”)注解将上述自定义配置文件test.properties中以test结尾的属性值注入到该配置类属性中。
- 如果配置类上应用的是@Component注解而非@Configuration注解,那么@EnableConfigurationProperties注解还能够省略
(3)进行测试
@RunWith(SpringRunner.class) // 测试启动器,并加载Spring Boot测试注解@SpringBootTest // 标记为Spring Boot单元测试类,并加载我的项目的ApplicationContext上下文环境class SpringbootDemoApplicationTests { @Autowired private MyProperties myProperties; @Test public void myPropertiesTest() { System.out.println(myProperties); }}
应用@Configuration编写自定义配置类
- 在Spring Boot框架中,举荐应用配置类的形式向容器中增加和配置组件
- 在Spring Boot框架中,通常应用@Configuration注解定义一个配置类,Spring Boot会主动扫描和辨认配置类,从而替换传统Spring框架中的XML配置文件。
- 当定义一个配置类后,还须要在类中的办法上应用@Bean注解进行组件配置,将办法的返回对象注入到Spring容器中,并且组件名称默认应用的是办法名,当然也能够应用@Bean注解的name或value属性自定义组件的名称。
演示:
(1)在我的项目下新建一个com.cyd.config包,并在该包下新创建一个类MyService,该类中不须要编写任何代码
public class MyService {}
创立了一个空的MyService类,而该类目前没有增加任何配置和注解,因而还无奈失常被Spring Boot扫描和辨认
(2) 在我的项目的com.cyd.config包下,新建一个类MyConfig,并应用@Configuration注解将该类申明一个配置类,内容如下:
@Configuration // 定义该类是一个配置类public class MyConfig { // 将返回值对象作为组件增加到Spring容器中,该组件id默认为办法名 @Bean public MyService myService() { return new MyService(); }}
MyConfig是@Configuration注解申明的配置类(相似于申明了一个XML配置文件),该配置类会被Spring Boot主动扫描辨认;应用@Bean注解的myService()办法,其返回值对象会作为组件增加到了Spring容器中(相似于XML配置文件中的标签配置),并且该组件的id默认是办法名myService。
(3)测试类
@RunWith(SpringRunner.class) // 测试启动器,并加载Spring Boot测试注解@SpringBootTest // 标记为Spring Boot单元测试类,并加载我的项目的ApplicationContext上下文环境class SpringbootDemoApplicationTests { @Autowired private ApplicationContext applicationContext; @Test public void iocTest() { System.out.println(applicationContext.containsBean("myService")); }}
上述代码中,先通过@Autowired注解引入了Spring容器实例ApplicationContext,而后在测试方法iocTest()中测试查看该容器中是否包含id为myService的组件。执行测试方法iocTest() ,查看控制台输入成果,后果如下:
从测试后果能够看出,测试方法iocTest()运行胜利,显示运行后果为true,示意Spirng的IOC容器中也曾经蕴含了id为myService的实例对象组件,阐明应用自定义配置类的模式实现了向Spring容器进行组件的增加和配置。
随机数设置及参数间援用
在Spring Boot配置文件中设置属性时,除了能够像后面示例中显示的配置属性值外,还能够应用随机值和参数间援用对属性值进行设置。上面,针对配置文件中这两种属性值的设置形式进行解说。
随机值设置
在Spring Boot配置文件中,随机值设置应用到了Spring Boot内嵌的 RandomValuePropertySource类,对一些隐秘属性值或者测试用例属性值进行随机值注入随机值设置的语法格局为${random.xx},xx示意须要指定生成的随机数类型和范畴,它能够生成随机的整数、uuid或字符串,示例代码如下:
my.secret=${random.value} // 配置随机值my.number=${random.int} // 配置随机整数my.bignumber=${random.long} // 配置随机long类型数my.uuid=${random.uuid} // 配置随机uuid类型数my.number.less.than.ten=${random.int(10)} // 配置小于10的随机整数my.number.in.range=${random.int[1024,65536]} // 配置范畴在[1024,65536]之间的随机整数
上述代码中,应用RandomValuePropertySource类中random提供的随机数类型,别离展现了不同类型随机值的设置示例。
参数间援用
- 在Spring Boot配置文件中,配置文件的属性值还能够进行参数间的援用,也就是在后一个配置的属性值中间接援用先前曾经定义过的属性,这样能够间接解析其中的属性值了。
- 应用参数间援用的益处就是,在多个具备互相关联的配置属性中,只须要对其中一处属性事后配置,其它中央都能够援用,省去了后续多处批改的麻烦
参数间援用的语法格局为${xx},xx示意先前在配置文件中曾经配置过的属性名,示例代码如下
app.name=MyAppapp.description=${app.name} is a Spring Boot application
上述参数间援用设置示例中,先设置了“app.name=MyApp”,将app.name属性的属性值设置为了MyApp;接着,在app.description属性配置中,应用${app.name}对前一个属性值进行了援用。
接下来,通过一个案例来演示应用随机值设置以及参数间援用的形式进行属性设置的具体应用和成果,具体步骤如下
(1)关上Spring Boot我的项目resources目录下的application.properties配置文件,在该配置文件中别离通过随机值设置和参数间援用来配置两个测试属性,示例代码如下
# 随机值设置以及参数间援用配置tom.age=${random.int[10,20]}tom.description=tom的年龄可能是${tom.age}
在上述application.properties配置文件中,先应用随机值设置了tom.age属性的属性值,该属性值设置在了[10,20]之间,随后应用参数间援用配置了tom.description属性。
(2)关上\我的项目的测试类,在该测试类中新增字符串类型的description属性,并将配置文件中的 tom.description属性进行注入,而后新增一个测试方法进行输入测试,示例代码如下
@Value("${tom.description}") private String description; @Test public void placeholderTest() { System.out.println(description); }
上述代码中,通过@Value("${tom.description}")注解将配置文件中的tom.description属性值注入到了对应的description属性中,在测试方法placeholderTest()中对该属性值进行了输入打印。执行测试方法placeholderTest() ,查看控制台输入成果。
总结
能够看出,测试方法placeholderTest()运行胜利,并打印出了属性description的注入内容,该内容与配置文件中配置的属性值保持一致。接着,反复执行测试方法placeholderTest(),查看控制台输入语句中显示的年龄就会在[10,20]之间随机显示。
最初
欢送关注公众号:前程有光,支付一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java外围知识点总结!