spring|spring IOC控制反转原理详解
目录
- IOC概念
- 补:工厂模式和单例模式区别
- IOC接口——实现IOC容器
- 1.BeanFactory
- 2.ApplicationContext
- IOC操作管理Bean
- xml配置bean
- 工厂Bean和普通Bean
- 注解配置bean
- 注册Bean
- 使用Bean
- Bean的配置
- 作用域:如何设置bean的单例or多例
- 生命周期:创建到销毁
- Bean扫描
- 总结
IOC概念
- 定义:控制反转,把对象的创建和调用(传统方式是通过new之后直接使用对象),交给Spring进行管理(依靠对象工厂通过注入的方式获取对象)
- 降低耦合度
- 底层原理:xml解析、工厂模式、反射
文章图片
补:工厂模式和单例模式区别
单例模式(懒汉式,饿汉式)都只能创建一个指定类的唯一对象
工厂模式(一个接口,多态性的体现)可以创建该接口的工厂下的所有类的唯一对象
【spring|spring IOC控制反转原理详解】
IOC接口——实现IOC容器 IOC容器可以有多个,new几个就有几个IOC容器,一个容器绑定一个xml文件,一个xml中可以配置多个bean,容器可以关闭
文章图片
1.BeanFactory
- Spring的内部接口,不建议开发者使用
- 懒汉式,加载配置文件的时候不创建对象
2.ApplicationContext
- BeanFactory的子接口
- 功能更强大,建议开发者使用
- 饿汉式,加载配置文件即创建对象
- 由于创建对象会耗费时间和资源,因此饿汉式可以把时间开销放在项目启动时
文章图片
第三个是基于注解的获取容器方式,利用反射而非解析xml配置
SpringBoot中获取ApplicationContext的三种方式
1.@Autowired: 在任意被spring托管的类中注入
2.ApplicationContextAware接口:实现这个接口可以在普通类中获取Spring的IOC容器
IOC操作管理Bean
xml配置bean
在bean.xml中配置了bean的属性后,先解析xml得到IOC接口对象(IOC容器),然后通过容器来getBean,获得对象
文章图片
同时,ApplicationContext也可以换成其父接口BeanFactory,结果不受影响
DI:依赖注入(注入属性)
两种方法
set方法+property
文章图片
有参构造+constructor
文章图片
工厂Bean和普通Bean
文章图片
注解配置bean
注册Bean 以下5个注解都可以创建Bean对象交给Spring的IOC容器进行管理
- @Component:以下4个的元注解
- @Service
- @Controller
- @Repository
- @Configuration
使用Bean
- @Autowired:根据类自动装配
- @Qualifier:根据别名装配,要和@Autowired搭配使用
- @Resource:即可根据类也可根据别名
- @Value:注入普通类型属性
文章图片
Bean的配置
作用域:如何设置bean的单例or多例
scope属性值:(常用singleton和prototype)
- singleton:默认值,单例对象,饿汉式
- prototype:多实例对象,懒汉式
- request请求、session会话:不常用
生命周期:创建到销毁
1.无参构造
2.调用set方法解析配置
3.调用bean的初始化方法
如果有配置了初始化方法,需要配置init-method=“初始化方法的名称”
例如:在@Bean(initmethod=“xxx方法”)
4.获取bean并使用
注解方法可以直接@Autowired注入bean,配置xml的方式通过
new ClassPathXmlApplicationContext(xxxx.xml)解析并获取IOC容器之后getBean
5.bean的销毁与销毁时方法
springboot中的bean创建与销毁
销毁方法的配置@Bean(destroyMethod = “xxxxx”)
如果是配置在xml中,则
xml配置的Bean的关闭:关闭IOC容器即可
文章图片
Bean扫描 spring中xml配置
文章图片
spring和springboot中的注解配置
@ComponentScan
文章图片
- 被Component及其子注解标注的Bean需要用ComponentScan扫描到才能使用
- SpringBootApplication启动类包括了@ComponentScan
- @ComponentScan默认扫描该类包下的所有Bean
- @ComponentScan可以自定义basePackages、includeFilters、excludeFilters
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- spring|spring boot整合redis主从sentinel方式
- spring|spring IOC容器管理必须知道的一些操作(基于XML方式)
- Mybatis-Spring源码分析图解
- springboot下mybatis-plus如何打印sql日志和参数到日志文件
- 五分钟手撸一个Spring容器(萌芽版)
- 发现Spring事务的一个实锤bug,官方还拒不承认(你来评评理...)
- Resty极简restful框架快速接入Spring
- 异步电机基础|交流异步电机矢量控制(三)——磁场定向
- 三相异步电机矢量控制变频调速matlab|三相异步电机矢量控制变频调速matlab,基于MATLAB/SIMULINK异步电机矢量控制系统的仿真...
- 异步电机基础|交流异步电机矢量控制(二)——矢量控制原理