162 SpringBoot高级原理

2023-12-31 23:16:46

1 SpringBoot自动化配置原理

01-SpringBoot 高级-starter依赖管理机制

通过依赖 spring-boot-dependencies 搜索 starter- 发现非常多的官方starter,并且已经帮助我们管理好了版本。

项目中使用直接引入对应的 starter 即可,这个场景下需要的依赖就会自动导入到项目中,简化了繁琐的依赖。

如果需要修改版本可以有两种方式:

查看spring-boot-dependencies里面规定当前依赖的版本 用的 key
使用Maven依赖管理的就近原则
引入 starter 不仅仅是帮助我们管理了依赖,还帮我做了很多的默认的配置信息,简化了大量的配置,使用更加的简单。

所有的场景启动器的底层都依赖 spring-boot-starter

xml

org.springframework.boot
spring-boot-starter
2.3.10.RELEASE
compile

小结:

引入官方starter依赖默认都可以不写版本
如果配置满足您当前开发需要,则默认配置即可

02-SpringBoot2高级-自动化配置初体验

目的:以web MVC自动化配置原理为例讲解,能够理解web MVC自动化配置加入了哪些依赖,做了哪些默认配置。

添加spring及spring web mvc相关依赖

springmvc.xml 配置文件配置了:

扫描controller 所在包
配置annotation-driven支持mvc功能
视图解析器
静态资源
拦截器
……
web.xml 配置:

初始化spring容器
初始化springmvc DispatcherServlet
post请求乱码过滤器
部署还需要单独的tomcat

也就是说:我们现在需要在开发业务代码前,就必须要准备好这些环境,否则无法完成业务代码,这就是我们现在的问题。

让这些问题成为过去,现在我们就探索一下SpringBoot是如何帮助我们完成强大而又简单自动化配置的。

引入 web 开发场景启动器依赖:

org.springframework.boot spring-boot-starter-web 帮助我们做了以下自动化配置:

依赖版本和依赖什么jar都不需要开发者关注
自动化配置
自动配好SpringMVC
引入SpringMVC全套组件
自动配好SpringMVC常用组件(三大组件,文件上传等)
自动配好Web常见功能,如:字符编码问题,静态资源管理
默认的包结构扫描
引导类所在包及其下面的所有子包里面的组件都会被默认扫描
无需以前的包扫描配置
想要改变扫描路径@SpringBootApplication(scanBasePackages=“com.it”)
或者@ComponentScan 指定扫描路径
自动配好Tomcat
小结:

有了SpringBoot以后,让开发人员重点关注业务本身,而不是环境上,提升了开发效率。

03-SpringBoot2高级-底层原理-@Configuration配置注解

目的:掌握@Configuration注解的作用及新特性

1、@Configuration注解的作用是替代原始 spring配置文件 功能

演示:

1)编写配置类

package com.it.sh.config;

import com.it.sh.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**

  • 1、@Configuration 替代 spring配置文件(配置bean)

  • 2、组件源码中包含 @Component 注解,当前类也会注册到 IOC 容器,默认类名小写

  • 3、默认都是单例的
    */
    @Configuration
    public class MyConfig {

    @Bean // 默认方法名称作为容器中的name
    public User getUser() {
    return new User();
    }
    }
    2)在引导类编写代码测试:

@SpringBootApplication
@MapperScan(basePackages = “com.it.sh.mapper”)
public class DataApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args);

// 根据name获取容器中的bean
User user1 = applicationContext.getBean(“getUser”, User.class);
User user2 = applicationContext.getBean(“getUser”, User.class);
System.out.println(user1 == user2);

MyConfig myConfig1 = applicationContext.getBean("myConfig", MyConfig.class);
MyConfig myConfig2 = applicationContext.getBean("myConfig", MyConfig.class);
System.out.println(myConfig1 == myConfig2);
// 注意:如果 MYConfig配置类没有按照规范编写,则容器中bean 的name为 类名

}
}
SpringBoot 提供一个注解和当前注解功能一样:@SpringBootConfiguration

2、proxyBeanMethods:代理bean的方法属性(since spring 5.2以后)

在这里插入图片描述
功能:

proxyBeanMethods = true:Full模式,保证每个@Bean方法被调用多少次返回的组件都是单实例的

proxyBeanMethods = false:Lite模式,每个@Bean方法被调用多少次返回的组件都是新创建的

演示:

默认 proxyBeanMethods=true,springBoot会检查这个组件是否在容器中有,有则直接引用
// 默认 proxyBeanMethods=true springBoot会检查这个组件是否在容器中有,有则直接引用
User user3 = myConfig1.getUser();
System.out.println(user1 == user3); // true
修改 proxyBeanMethods=false,则每调用一次Spring就会创建一个新的Bean对象

在这里插入图片描述
在执行结果则为 false, 证明两次获取的bean不是同一个bean。

小结:

组件依赖必须使用Full模式默认。其他默认是否Lite模式

Full模式每次都会检查bean,效率较Lite模式慢

文章来源:https://blog.csdn.net/weixin_44498127/article/details/135299031
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。