162 SpringBoot高级原理
SpringBoot高级原理
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模式慢
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!