Spring原理

目录

一、Bean作用域

1、Bean作用域概念

2、Bean的六种作用域

3、举例演示bean的几种作用域

二、Bean的生命周期

1、Bean对象的生命周期

2、演示Bean对象的生命周期

三、SpringBoot的自动配置

1、概念

2、spring将对象存入容器中的原理

一、Bean作用域

在前面springIOC&DI中,我们知道交由spring管理的对象称为bean对象。

通过注解:@Component、@Service、@Configuration、@Controller、@Repository、@Bean可以将一个对象交由spring容器管理。

通过ApplicationContext来获取bean对象,根据类名.class、根据bean名称、根据bean名称+类名获取bean对象。

通过@Autowired、Setter、构造方法可以为应用程序注入所依赖的Bean对象。

详细内容可以看:springIOC&DI

1、Bean作用域概念

Bean对象的作用域是指Bean在spring框架中的行为模式。

2、Bean的六种作用域

(1)singleton---单例作用域

每个Spring IoC容器内相同名称的bean对象只有一个实例(单例模式);

(2)prototype---多例作用域

每次使用该bean时都会产生一个新的bean对象实例;

(3)request---请求作用域

每个http请求周期内会产生一个新的bean对象实例;

(4)session---会话作用域

每个http会话周期内会产生一个新的bean对象实例;

(5)Application---全局作用域

每个servletContext生命周期内会产生一个新的bean对象实例;

(6)websocket---HTTPWebSocket作用域

每个webSocket生命周期内会产生一个新的bean对象实例;

3、举例演示bean的几种作用域

(1)singleton

在容器中存储作用域为singleton的bean对象:

两次方式注入bean对象,观察两种方式地址:

两次获取同一个bean对象的结果:

获取到的对象是一样的。

(2)prototype

在容器中存储作用域为prototype的bean对象:

两次方式注入bean对象,观察两种方式地址:

两次获取同一个bean对象的结果:

两次获得的对象地址不一样。

(3)request

在容器中存储作用域为request的bean对象:

两次方式注入bean对象,观察两种方式地址:

两次获取同一个bean对象的结果:

刷新页面:

两次结果不一样。

(4)session

在容器中存储作用域为session的bean对象:

两次方式注入bean对象,观察两种方式地址:

两次获取同一个bean对象的结果:

换浏览器观察:

两次结果不一样

(5)Application

在容器中存储作用域为Application的bean对象:

两次方式注入bean对象,观察两种方式地址:

两次获取同一个bean对象的结果:

结果是一样的。

ps:singleton与Application的区别---Application是ServletContext的单例,singleton是一个ApplicationContext的单例。在一个web容器中ApplicationContext可以有多个。

二、Bean的生命周期

生命周期指一个对象从产生到销毁的过程。

1、Bean对象的生命周期

(1)实例化---为Bean对象分配内存空间

(2)属性赋值---Bean对象注入

(3)初始化---对Bean对象进行逻辑判断等初始化

(4)使用Bean

(5)销毁Bean

2、演示Bean对象的生命周期

(1)代码演示

(2)结果

三、SpringBoot的自动配置

1、概念

SpringBoot的自动配置指SpringBoot将所依赖jar包中的配置类和bean对象加载到springIoC容器中,不需要我们手动声明,简化了开发。

2、spring将对象存入容器中的原理

(1)模拟第三包--不同目录下

(2)测试注入第三包

结果:

找不到MyJar这个bean类型。

(3)原因分析

是因为第三方包和SpringBoot启动类不在同一个目录下,而将对象存储到容器中时,启动类只会扫描自己所在包及其子包,其他包不会进行扫描。

(4)解决方案

①@ComponentScan--组件扫描

该注解可以指定启动类扫描哪些包,可以指定多个。

②@Import--手打导入类到容器中

该注解可以把所需要的类导入到容器中,可以导入多个类。

(5)springBoot自动配置的方式

对于以上两种导入包到类中的方式,springBoot没有进行使用,是因为使用者必须知道第三方依赖中有哪些Bean对象或配置类,很容易漏掉其中某些。

springBoot将导包的过程交给了第三方依赖,由第三方依赖进行选择性的导包。

SpringBoot实现自动配置的核心注解为@SpringBootApplication,该注解源码:

前四个为元注解,后三个是该注解的主要核心:

①@SpringBootConfiguration

该注解里有@Configuration,本质上也是标注当前类为配置类。

②@ComponentScan

指定启动类扫描路径,没有指定包时,将从声明该注解类的包开始扫描,这也是为什么SpringBoot项目声明注解类必须要在启动类的目录下。

③@EnableAutoConfiguration

该注解是开启自动配置。

有两个核心注解:@AutoConfigurationPackage和@Import

@AutoConfigurationPackage:导入配置类包,把启动类所在的包下面所有组件都注入到Spring容器中。

@Import:导入配置文件,即读取当前项目下所依赖jar包中两个文件里面定义的配置类,不是所有配置全部加载进来,而是根据不同条件有选择的导入配置类。

相关推荐
javachen__几秒前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
uzong5 小时前
技术故障复盘模版
后端
GetcharZp6 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程6 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen6 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研6 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi7 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
没有bug.的程序员7 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋7 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国8 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端