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

相关推荐
旋律41414 分钟前
同义方法区别(增加类与删除类)
java·后端
调试人生的显微镜14 分钟前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
后端·ios
学到老活到老16 分钟前
方法执行完了,对象为什么还占着内存?
java·jvm
用户77712985091216 分钟前
常见的同义方法的区别:增加类和删除类
java·后端
房西杭19 分钟前
行会仓库 GuildStoreMgr(Lua,和 StoreMgr / BagMgr 容器接口对齐)
后端
站大爷IP23 分钟前
Python的文本IO把我坑惨了,原来read和readlines的区别这么大
后端
没事写点啥23 分钟前
WeKnora 上下文管理
后端·ai编程
十年Java程序媛24 分钟前
Java this 与 super 详解|继承高频踩坑 + 面试题整理
java·spring boot·面试
爱勇宝25 分钟前
AI 都这么强了,咱们程序员以后还能干点啥?
前端·后端·程序员