JavaEE开发的
一站式
解决方案!
简化Spring应用开发的一个框架,整个Spring技术栈的一个大整合;
2014 ,martin fowler马丁·福勒
提出的:微服务架构风格
常听的:分布式微服务
优点:
一个应用拆分为一组小型服务
每一个服务: 运行在自己的进程内,也就是可独立部署和升级,通过HTTP的方式进行互通;
• 服务围绕业务功能拆分
• 可以由全自动部署机制独立部署
• 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术;只要实现功能即可~
上图:微服务分布式架构,每一个点表示一个功能, 使用时只需要调用需要的功能模块组合即可!
缺点:
- 运维要求高: 更多的服务意味着要投入更多的运维。
- 分布式固有的复杂性:
使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、
分布式事务等都会带来巨大的问题。- 接口调整成本高:
微服务之间通过接口进行通信。
如果修改某一个微服务的API,可能所有用到这个接口的微服务都需要进行调整。
远程调用、服务发现、负载均衡、服务容错、配置管理、服务监控、链路追踪、日志管理、任务调度……
说到微服务架构,不得不提的就是 单体应用
一个归档包(可以是JAR、WAR、EAR或其它归档格式)包含所有功能的应用程序,通常称为
单体应用。
优点
- 便于共享: 单个归档文件包含所有功能,便于在团队之间以及不同的部署阶段之间共享。
- 易于测试:
单体应用一旦部署,所有的服务或特性就都可以使用了,这简化了测试过程。
因为没有额外的依赖,每项测试都可以在部署完成后立刻开始。- 易于部署: 只需将单个归档文件复制到单个目录下。
缺点
- 复杂性高:
由于是单个归档文件,所以一个文件 等于 整个项目,文件包含的模块非常多,导致模块的边界模糊。
依赖关系不清晰、代码的质量参差不齐,混乱的堆在一起,使得整个项目非常复杂。
以致每次修改代码,都非常小心,可能添加一个简单的功能,或者修改一个Bug都会带来隐藏的缺陷。- 技术债务:
随着时间的推移、需求的变更和技术人员的更替,会逐渐形成应用程序的技术债务,并且越积越多。- 扩展能力受限:
单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。
(为了提高项目性能可以, 将一个项目复制多份部署多台服务器~)- 阻碍技术创新:
对于单体应用来说,技术是在开发之前经过慎重评估后选定的,
每个团队成员都必须使用相同的开发语言、持久化存储及消息系统。
Java8 或以上 学习
Maven3.3 或以上 学习
本人使用的编辑器是: Idea2020
或其它编辑器,Spring官方的推荐的 STS
settings.xml
文件修改配置~ Maven——conf目录下:
<mirrors>
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
mirrors>
<profiles>
<profile>
<id>jdk-1.8id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>1.8jdk>
activation>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
properties>
profile>
profiles>
Springboot是用于简化原始Spring的复杂
快速创建出生产级别的Spring应用,也是Spring技术栈的一站式框架。
本质上还是Spring,只不过将以往需要配置的信息封装到底层,使开发者更加快捷的搭建好环境。
因此被称为Spring的脚手架
:
- 脚手架指的是两种技术之一:
第一种是与某些MVC 框架中的数据库访问相关的代码生成技术;
第二种是由各种工具支持的项目生成技术。
内嵌Web服务器
创建独立的Spring应用
无代码生成,无需编写XML
自动starter以来,简化构建配置
自动配置Spring以及第三方功能
提供生产级别的监控、健康检查以及外部化配置
人称版本帝,迭代快,需要时刻关注变化
封装太深,内部原理复杂,不容易精通
好了,从现在开始我们可以迅速创建一个SpringBoot应用,
可以通过IDEA的快捷配置方式
同时也可以使用Maven直接配置,在这里只演示第二种方式。
需求:浏览发送/hello请求,响应 Hello, Spring Boot 2
引入依赖:
pom.xml
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.6.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
SpringBoot程序需要一个入口: 负责启动开启应用程序
类注解
方便初始化应用!import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication //标注主程序类,这是一个Springboot应用!
//@SpringBootApplication(scanBasePackages = "指定扫描包下注解~") //默认扫描该类的包及子包~
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//作用:该类是一个Controller控制器 且 下所有方法的返回值为一个JSON
//相当于是一个:@Controller 和 @ResponseBody 注解的集合,内部SpringBoot 自定义了完善的属性配置,当然也可以通过配置修改覆盖...
@RestController
public class HelloController {
//相当于: 以前SpringMVC的 @RequestMapping get方式请求~
//@RequestMapping(value = "/show" ,method = RequestMethod.GET)
@GetMapping(value = "/show") //@GetMapping用于处理请求方法的GET类型,@PostMapping用于处理请求方法的POST类型等。
public String Hello(){
return "Hello Wrod!!";
}
}
每错直接启动即可:SpringBoot中有自带的集成运行环境容器;
可以清除的看到 Tomcat initialized with port(s): 8080 (http)
使用Maven 打包程序:
pom.xml
文件中加入
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.2.6.RELEASEversion>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
ok, 到这基本体现到 SpringBoot 应用程序的强大!
无须服务器!单体项目~ 强大注解生态资源自带集成~!!
SpringBoot 对依赖管理非常强大!
在Spring Boot入门程序中,项目pom.xml文件有两个核心依赖~
分别是spring-boot-starter-parent
和spring-boot-starter-web
关于这两个依赖的相关介绍具体如下。
举例说明:pom.xml
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.6.RELEASEversion>
parent>
Ctrl+鼠标左键
进入并查看spring-boot-starter-parent底层源文件:spring-boot-dependencies
,核心代码具体如下。<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.1.3.RELEASEversion>
<relativePath>../../spring-boot-dependenciesrelativePath>
parent>
...
继续查看spring-boot-dependencies底层源文件,核心代码具体如下。
<properties>
<activemq.version>5.15.8activemq.version>
...
<solr.version>7.4.0solr.version>
<spring.version>5.1.5.RELEASEspring.version>
<spring-amqp.version>2.1.4.RELEASEspring-amqp.version>
<spring-batch.version>4.1.1.RELEASEspring-batch.version>
<spring-cloud-connectors.version>2.0.4.RELEASEspring-cloud-connectors.version>
<spring-data-releasetrain.version>Lovelace-SR5spring-data-releasetrain.version>
<spring-framework.version>${spring.version}spring-framework.version>
<spring-security.version>5.1.4.RELEASEspring-security.version>
<spring-session-bom.version>Bean-SR3spring-session-bom.version>
<spring-ws.version>3.0.6.RELEASEspring-ws.version>
<sqlite-jdbc.version>3.25.2sqlite-jdbc.version>
<statsd-client.version>3.1.0statsd-client.version>
<sun-mail.version>${javax-mail.version}sun-mail.version>
<thymeleaf.version>3.0.11.RELEASEthymeleaf.version>
<tomcat.version>9.0.16tomcat.version>
<unboundid-ldapsdk.version>4.0.9unboundid-ldapsdk.version>
<undertow.version>2.0.17.Finalundertow.version>
<versions-maven-plugin.version>2.7versions-maven-plugin.version>
<webjars-hal-browser.version>3325375webjars-hal-browser.version>
<webjars-locator-core.version>0.35webjars-locator-core.version>
properties>
spring-boot-dependencies
底层源文件可以看出开发中见到很多:见到很多 spring-boot-starter-*
spring-boot-starter-parent父依赖启动器的主要作用是进行版本统一管理:
那么项目运行依赖的JAR包是从何而来?又是怎样管理的呢?
下面,查看项目pom.xml
文件中的spring-boot-starter-web
依赖。
查看spring-boot-starter-web
依赖文件源码,核心代码具体如下。
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.1.3.RELEASEversion>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jsonartifactId>
<version>2.1.3.RELEASEversion>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<version>2.1.3.RELEASEversion>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.hibernate.validatorgroupId>
<artifactId>hibernate-validatorartifactId>
<version>6.0.14.Finalversion>
<scope>compilescope>
dependency>
dependencies>
spring-boot-starter-web依赖启动器的主要作用:
Spring Boot除了提供有上述介绍的Web依赖启动器外,还提供了其他许多开发场景的相关依赖,我们可以打开Spring Boot官方文档,搜索“Starters”关键字查询场景依赖启动器,具体如下图所示。
@SpringBootApplication注解表示Spring Boot启动类。
按住: Ctrl + @SpringBootApplication
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//以上一些Java的注解无伤大雅!
@SpringBootConfiguration // 标明该类为配置类
@EnableAutoConfiguration // 启动自动配置功能
@ComponentScan( // 包扫描器
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {
TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {
AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
@SpringBootApplication注解是一个组合注解:
包含@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
三个核心注解
@SpringBootConfiguration注解表示类为: Spring Boot配置类
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@SpringBootConfiguration注解内部有一个核心注解@Configuration
@EnableAutoConfiguration注解表示开启自动配置功能
该注解是Spring Boot框架最重要的注解,也是实现自动化配置的注解。
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage // 自动配置包
@Import({
AutoConfigurationImportSelector.class}) // 自动配置类扫描导入
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {
};
String[] excludeName() default {
};
}
@EnableAutoConfiguration注解也是一个组合注解,
它主要包括有@AutoConfigurationPackage
和@Import
两个核心注解。
自己查看以下注解 Ctrl +
@AutoConfigurationPackage:类
自动配置包?指定了默认的包规则
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {
}
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
查看AutoConfigurationImportSelector类的getAutoConfigurationEntry()方法,核心代码具体如下。
Ctrl + F
Idea查看文本
protected AutoConfigurationImportSelector.AutoConfigurationEntry
getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 获取所有Spring Boot提供的后续自动配置类XxxAutoConfiguration
List<String> configurations =
this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
// 筛选并过滤出当前应用环境下需要的自动配置类XxxAutoConfiguration
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(
configurations, exclusions);
}
}
在上述展示的getAutoConfigurationEntry()方法,
另外,在上述核心方法中加粗显示了2个重要的业务处理方法,具体说明如下。
SpringBoot 提供的自动配置类
SpringBoot在启动的时候从自动配置类路径下的META-INF/spring.factorles中获取
EnableAutoConfiguration指定的值,并将这些值作为自动配置类导入到容器中,自动配置类就生效。
在项目中加入了Web环境依赖启动器
@ComponentScan注解是一个组件包扫描器,
其主要作用是扫描指定包及其子包下所有注解类文件作为Spring容器的组件使用。
okok, 就到这里了, 后面在深入研究~ 好累需要反复斟酌~
相当于 Spring配置文件中的< beans>标签
告诉SpringBoot这是一个配置类,配置类本身也是组件 等于以前Spring项目的Sring配置文件.xml;
配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的 Full
另外注意,被@configuration标注的类本身,也会作为一个bean注入到容器中的。
proxyBeanMethods:代理bean的方法
给容器中添加组件。
以方法名作为组件的 id。返回类型就是组件类型。返回的值,就是组件在容器中的实例;
以上项目加一个包 com.wsm.entity
加一个 测试实体类 User.Java
public class User {
private int id=0;
private String name="默认";
//get/set
//toString()....
加一个包 com.wsm.config
加入一个 配置类
ConfigXX.Java
//配置类学习
@Configuration
public class ConfigXX {
//Bean
//就相当于以前的:
@Bean //以方法名作为组件的id 返回类型就是组件类型。返回的值,就是组件在容器中的实例
public String str(){
return "字符";
}
@Bean("myUser") //指定组件id名,将该对象存储到spring的上下文中 (环境中)
public User user() {
User user = new User();
user.setId(1);
user.setName("张三");
return user;
}
@Bean("tom")
public User userTom(){
User user = new User();
user.setId(1);
user.setName("tom");
return user;
}
}
主程序类SpringBootRun.Java
@SpringBootApplication //标注主程序类,这是一个Springboot应用!
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
//查看容器里面所有的组件,Bean
String[] names = run.getBeanDefinitionNames();
System.out.println("-----------所有的组件Bean----------");
for (String name : names) {
//因为,有很多是默认的所以会有很多~
System.out.println(name);
}
//从容器中根据id获取指定组件
String str = (String)run.getBean("str"); //方法返回Object类型——》强制转换
System.out.println(str);
//查询Spring上下文存在该元素
boolean isok = run.containsBean("str");
System.out.println(isok);
User myUser = (User)run.getBean("myUser");
System.out.println(myUser);
User tom1 = (User)run.getBean("tom");
User tom2 = (User)run.getBean("tom");
System.out.println(tom1==tom2); //比较结果:true 结论@Configuration默认模式是Full 单例
//被@Configuration注解的类同时也被注入
ConfigXX cfx = (ConfigXX)run.getBean(ConfigXX.class);
System.out.println(cfx.user()==cfx.user()); //结果为true 调用new 的方法同样是true;
}
}
以上的配置类 的使用, 刚开始学习时候有一点的不舒服~
SpringBoot 本质上是Spring的管理, 当然还是支持Spring的核心 IOC
也还可以使用以前的Spring配置文件来管理项目!
Maven工程 resource资源目录下添加一个Sping配置文件:
beanConf.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="w" class="com.wsm.entity.User">bean>
beans>
主程序
@SpringBootApplication //标注主程序类,这是一个Springboot应用!
@ImportResource("classpath:beanConf.xml") //classpath表示就是资源目录下; 这里不多解释了...
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
User user = (User) run.getBean("w");
System.out.println(user);
}
}
声明在类上
这个注解在老版本SpringBoot1中,将他放在configuration 配置类上的时候
但是在新版本中,可以引入任何类,不一定是configuration类。
语法:
@import({注入类.class,多个类.class})
主程序类
@SpringBootApplication //标注主程序类,这是一个Springboot应用!
@Import({
User.class})
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
User u = run.getBean(User.class);
System.out.println(u);
}
}
注意:
使用前要确保该类型确实不存在任何一个Spring管理Bean
不然:
这个注解主要是标注需要扫描哪些包路径。
该路径下标注了@service, @controller,@repository, @component的类,
都将被注入到容器中。除了这四个标签,包路径下标注了@configuration类,也会被注入到容器中。
@import 升级版本!
声明在 配置类上!@Configuration
只有满足Conditional指定的条件,则进行 配置类组件注入!!!
实现动态配置 SpringBoot 的组件, 对一些组件进行判断则生成~
大致原理有兴趣在研究
~修改ConfigXX.Java
@Configuration
@ConditionalOnBean(name = "abc") //检查上下文中是否存在abc,如果存在,才执行下面的所有的创建操作
//@ConditionalOnMissingBean(name = "abc")
//检查上下文中是否存在abc,如果没有存在,执行下面的所有的创建操作
public class ConfigXX {
//Bean
//就相当于以前的:
@Bean //以方法名作为组件的id 返回类型就是组件类型。返回的值,就是组件在容器中的实例
public String str(){
return "字符";
}
@Bean("tom")
public User userTom(){
User user = new User();
user.setId(1);
user.setName("tom");
return user;
}
@Bean("myUser") //指定组件id名,将该对象存储到spring的上下文中 (环境中)
public User user() {
User user = new User();
user.setId(1);
user.setName("张三");
return user;
}
}
分别执行主程序:
@SpringBootApplication
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
//查看容器里面所有的组件,Bean
String[] names = run.getBeanDefinitionNames();
System.out.println("-----------所有的组件Bean----------");
for (String name : names) {
//因为,有很多是默认的所以会有很多~
System.out.println(name);
}
}
}
@ConditionalOnBean(name = “abc”) 存在执行
@ConditionalOnMissingBean(name = “tom”) 不存在执行
在编写项目代码时,我们要求更灵活的配置,更好的模块化整合。
application.properties
或 application.yml
文件中,application.properties和application.yml文件的区别
一般上来说,当我们创建一个SpringBoot项目时
,IDE会默认帮我们创建一个application.properties配置文件。有些朋友习惯把.properties文件改成.yml文件。
声明在 @ConfigurationProperties 类上
@Component (把普通pojo实例化到spring容器中,相当于配置文件中的 ) 泛指各种组件,
就是说当我们的类不属于各种归类的时候 (不属于@Controller、@Services等的时候)
我们就可以使用@Component来标注这个类。
@EnableConfigurationProperties注解的作用是: 使用 @ConfigurationProperties 注解的类生效。
如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component
那么在IOC容器中是获取不到properties 配置文件转化的bean。
说白了 @EnableConfigurationProperties
相当于把使用 @ConfigurationProperties 的类进行了一次注入。
@EnableConfigurationProperties 和 @Component 二者取其一
.properties
com.wsm.entity包下加入 Student.Java
//配置类注解,被自动扫描发现
//@Component
@ConfigurationProperties(prefix = "stu") //指明前缀
@PropertySource("classpath:application.properties") //指明配置源文件位置
public class Student {
private int id;
private String name;
//get/set/toString()....
}
resources目录下加入application.properties
# 修改SpringBoot的端口 默认8080
server.port=9090
#根据@ConfigurationProperties 声明类的前缀进行 .属性=值 注入;
stu.id=10001
stu.name=admin
#.properties文件
#键值注入 字符串不需要引号..
主程序:
@SpringBootApplication
@EnableConfigurationProperties({
Student.class})
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
Student stu = run.getBean(Student.class);
System.out.println(stu);
}
}
.yml
com.wsm.entity包下加入 Person.java
@ConfigurationProperties(prefix = "person")
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private User user;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
//get/set/toString()
}
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
YAML 支持的数据结构有三种
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
一组键值对,使用冒号结构表示
键:值
:冒号后面必须跟着空格!! 一定要注意错误了不易检查!!
resources目录下加入application.yml
person:
userName: 张三
boss: true
birth: 2020/01/01 15:20:30
age: 20
user: #对象User类型
id: 1001
name: 张三
interests: ['test01','test02'] #字符串数组
animal: #字符串集合
- cat #字符串值
- dog
score: #Map类型 String,Object类型
english: #Map元素键1
first: 100 #Map键1的值:又是一个Map类型
last: 20
math: [10,20,30,40] #Map元素键2:也是一个Map类型
chinese: {one: 50,two: 60,three: 70}
salarys: [4555.5,4666.5,4777.5]
主程序:
@SpringBootApplication
@EnableConfigurationProperties({
Student.class, Person.class})
public class SpringBootRun {
public static void main(String[] args) {
//用来执行开启SpringBoot程序; 参数当前主程序类.class args
ConfigurableApplicationContext run = SpringApplication.run(SpringBootRun.class,args);
Person person = run.getBean(Person.class);
System.out.println(person);
}
}
自定义
自动配置类的作用,配置注入功能组件自动完成。
根据上面的 SpringBoot的特定得知SpringBoot的底层就是大量的 自动配置类 SpringBoot2 128个
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>SpringBoot128artifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-autoconfigureartifactId>
<version>2.1.6.RELEASEversion>
dependency>
dependencies>
project>
Spring Boot优化了很多配置的方式方法,
让我们少去了很多配置的环节。但又给了我们自定义配置的选择权。
在SpringBoot中会有许多的自带自动装配,
通常在启动时加载,如何实现自己定义的自动装配?我们需要三个 关键类:
该类的作用是读取hello开头的属性配置文件
读取值后会存入到容器中。默认值是Spring Boot
HelloProperties.Java
@Component
@ConfigurationProperties(prefix = "hello") //使用配置绑定 前缀hello
public class HelloProperties {
private String msg = "SpringBoot";
//默认值 SpringBoot,如果引入自动配置的项目可以通过 .properties .yml 文件中,进行更改!
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
该类主要处理 配置类要执行的主要功能!!
我们定义该类来将定义的msg加上hello前缀。
Hello.Java
public class Hello {
private String msg;
public String say(){
return "hello"+getMsg(); //打印输出Hello + msg
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
整合类是最重要的类,它关系着前两个类的运作。
HelloAutoConfigration.Java
@Configuration //这是一个配置类
@ConditionalOnClass(Hello.class) //是否存在 Hello的类,没有不执行类中操作...
@EnableConfigurationProperties(HelloProperties.class) //开启使用 @ConfigurationProperties 注解的类生效。
@ConditionalOnProperty(prefix = "hello", value = "enabled", matchIfMissing = true)
//prefix 数组,获取property名称的前缀,可有可无
//name 数组,property完整名称或部分名称,与prefix组合使用组成完整属性名称,与value不可同时存在
//value 数组,获取property完整名称或部分名称,与prefix组合使用成完整属性名称,与name不可同时存在
//havingValue 比较获取的属性值与havingValue给定的值是否相同,相同才加载配置类
//matchIfMissing 缺少property时是否加载,如果为true,没有该property属性也会正常加载,反之报错。
//是否存在 hello 属性则执行下面操作..
public class HelloAutoConfigration {
@Autowired
private HelloProperties helloProperties;
@Bean
@ConditionalOnMissingBean
public Hello createHello() {
Hello hello = new Hello();
hello.setMsg(helloProperties.getMsg());
return hello;
}
}
将maven文件打包后加载入仓库
给要使用的类添加pom配置
HelloController.Java
import com.wsm.Hello; //引入依赖的类型;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //@Controller @ResponseBody
public class HelloController {
@Autowired
private Hello hello; //注入
@GetMapping(value = "/showMsg")
public String shoMsg(){
return hello.say();
}
}
pom.xml
<dependency>
<groupId>org.examplegroupId>
<artifactId>SpringBoot128artifactId>
<version>1.0-SNAPSHOTversion>
dependency>