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