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包中两个文件里面定义的配置类,不是所有配置全部加载进来,而是根据不同条件有选择的导入配置类。

相关推荐
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2342 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*4 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue4 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man4 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟4 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity5 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天5 小时前
java的threadlocal为何内存泄漏
java