SpringBootWeb原理篇

目录

配置文件(方式)

三种配置文件优先级排名(从高到低)

另外两种配置方式

优先级

思考

注意事项

Bean管理

1. 从IOC容器中获取到bean对象

2. bean的作用域(了解,一般不用配置,默认单例)

3. 管理第三方的bean对象

@Bean注解

SpringBoot原理

起步依赖

自动配置

方案

第三方依赖中提供的注解

原理

原理分析

自定义起步依赖starter分析

实现步骤


配置文件(方式)

三种配置文件优先级排名(从高到低)

1. properties配置文件

2. yml配置文件

3. yaml配置文件

另外两种配置方式

Java系统属性配置 (低)(格式: -Dkey=value)

命令行参数 (高)(格式:--key=value)

优先级

命令行参数 >  系统属性参数 > properties参数 > yml参数 > yaml参数

思考

项目已经打包上线了,这个时候我们又如何来设置Java系统属性和命令行参数呢?

在项目所在文件中敲cmd,进入命令窗口java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010

注意事项

Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目,会自动添加该插件)

Bean管理

引入管理其他依赖时一定要先获取

一定要先声明这个,才能引入其他依赖  通过.getBean获取bean
@Autowired
  private ApplicationContext applicationContext;

1. 从IOC容器中获取到bean对象

根据name获取bean

Object getBean(String name)

//bean对象.getBean("本类的首字母小写全名")

根据类型获取bean

<T> T getBean(Class<T> requiredType)

//bean对象.getBean(本类全名.class)

根据name,类获取bean(带类型转换)

<T> T getBean(String name, Class<T> requiredType)

//bean对象.getBean("本类的首字母小写全名",本类全名.class)

2. bean的作用域(了解,一般不用配置,默认单例)

Spring中的@Scope注解来进行配置作用域

@Scope("作用域属性")

作用域配置

singleton

IOC容器中名称的bean只有一个单例(默认),在容器启动时被创建

prototype

每次使用该bean时会创建新的实例(非单例)

控制器(了解)

@Lazy   //延迟加载

第一次使用bean对象时,才会创建bean对象并交给ioc容器管理

3. 管理第三方的bean对象

先在pom.xml文件中,引入dom4j

<!--Dom4j-->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

原因

第三方提供的类是只读的。无法在第三方类上添加@Component注解或衍生注解

@Bean注解

管理的bean对象来自于第三方(不是自定义的)

解决方案

在启动类上添加@Bean标识的方法

不建议使用(项目中要保证启动类的纯粹性)

@Bean方法上,方法的返回值就是Bean的类型,方法名默认是Bean的name

在配置类中定义@Bean标识的方法

定义一个配置类

@Configuration //配置类  (在配置类当中对第三方bean进行集中的配置管理)
public class CommonConfig {

    //声明第三方bean
    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
          //通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
    public SAXReader reader(DeptService deptService){
        System.out.println(deptService);
        return new SAXReader();
    }

}

从config中引入第三方Bean

@Autowired
private SAXReader saxReader;
    
    @Autowired
    private ApplicationContext applicationContext;
    //使用原始默认的Bean的名字 ,首字母小写
    @Test
    public void testBean(){
        Object saxReader = applicationContext.getBean("saxReader");
        System.out.println(saxReader);
    }

当想在第三方Bean中注入其他Bean,直接在第三方Bean的方法参数中引入(Bean的类名   空格  首字母小写类名 )

注意事项

通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。

如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

SpringBoot原理

Spring Framework:繁琐(依赖,配置)
Spring Boot(底层还是SpringFramework):简单快捷

起步依赖

原理就是Maven的依赖传递。

所有的常见依赖(官网地址:https://docs.spring.io/spring-boot/docs/2.7.7/reference/htmlsingle/#using.build-systems.starters)。

web开发的起步依赖:springboot-starter-web

官方或者第三方,把一个具体功能所需要的所有坐标依赖及版本进行统一管理,只需要引入starter的坐标即可

自动配置

SpringBoot项目在启动时通过自动配置完成了bean对象的创建,并放入IOC容器中

方案

方案1:@ComponentScan 组件扫描

1. 使用繁琐

2. 性能低

方案2:@Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)

导入形式

普通类

配置类

ImportSelector接口实现类

其类中重写接口中的方法,方法中写的是返回值是要成为bean的权限定类名

结论

我们不用自己指定要导入哪些bean对象和配置类了,让第三方依赖它自己来指定

第三方依赖中提供的注解

1.使用第三方依赖提供的 @EnableXxxxx注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
public @interface EnableHeaderConfig { 
}

2.在使用时只需在启动类上加上@EnableXxxxx注解即可

原理

@SpringBootApplication
@EnableAutoConfiguration
@Import导入了一个实现ImportSelector接口的类
有selectImports方法--读取jar包中META-INF/spring/xxxxxxx.imports文件的内容
文件内容是需要自动配置的Bean的全类名,通常是配置类
配置类里的所有@Bean方法也同时放入容器了

原理分析

SpringBoot启动类上使用的核心注解@SpringBootApplication

元注解(不再解释)

@SpringBootConfiguration

声明当前类是一个配置类

@SpringBootConfiguration注解上使用了@Configuration,表明SpringBoot启动类就是一个配置类。

@EnableAutoConfiguration

封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)

在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。

@ComponentScan

用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。

@Conditional

作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring的IOC容器中。

位置:方法、类

本身是父注解,派生的子注解:

@ConditionalOnClass(name=""):判断环境中有对应字节码文件,才创建bean到IOC容器。

@ConditionalOnMissingBean(name=""):判断环境中没有对应的bean(类型或名称),不存在才创建bean到IOC容器。

@ConditionalOnProperty(name ="",havingValue = ""):判断配置文件中有对应属性和值,决定是否创建bean到IOC容器。

自定义起步依赖starter分析

1. starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])

2. autoconfigure模块(自动配置)

实现步骤

第1步:创建自定义starter模块(进行依赖管理)

把阿里云OSS所有的依赖统一管理起来

第2步:创建autoconfigure模块

在starter中引入autoconfigure (我们使用时只需要引入starter起步依赖即可)

第3步:在autoconfigure中完成自动配置

1. 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好

2. 定义配置文件,把自动配置类的全类名定义在配置文件中

点击这里查看更多知识

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值