Spring之IOC
简介
首先,官网中有这样一句话:Spring Framework implementation of the Inversion of Control (IoC) principle.这句话翻译过来就是:Spring实现控制反转(IOC)原理,由此可以得出,Inversion of Control(IOC)是一个名为控制反转的原理,而Spring实现了他。而实现这个原理或者说设计原则的最常见的方式也是Spring框架使用的方式叫做依赖注入,也就是Dependency Injection(DI)。因此我们要讲IOC实际上就是要讲Spring是怎样实现IOC和DI的,具体用什么、怎样去做的。
- 控制反转:类的对象从创建到销毁的整个流程都交给IOC容器去管理
- 依赖注入:我们通过几种注入的方式将特定的bean注入到IOC容器中。
Bean
Bean是Spring实现IOC的一个重要的概念,官网是这样说的:
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
通过这句话我们能看出来,bean实际上就是被Spring IOC容器实例化、组装、管理的对象。也就是说,创建并且管理对象的事儿不用我们去管了,这些都交由Spring框架的IOC容器去管理,这也就是控制反转的思想,而bean就是我们注入的对象。而bean什么时候去实例化将不会再写死在程序中,也就是我们不需要将对象实例化,只需要用的时候去拿就行了,这种方式不仅让我们不用再花心思管理对象,而且也能避免我们自己一些错误的实例化对象导致的内存问题。
Bean的生命周期
- 单例:当容器创建时创建对象,伴随容器一直处于生存状态,当容器被销毁时对象才被销毁
- 多例:当对象被使用时创建新的对象,伴随对象的使用一直处于生存状态,当对象在一定时间内不被使用时被GC回收掉
注入Bean的方式
- 构造函数注入:默认为无参构造,若为无参构造方式注入则需要类中必须存在有效的无参构造函数,不然会报异常
- Setter 方法注入:通过类中的Setter方法注入实例化对象
- 字段注入:通过字段名称直接给字段注入值,也可以直接注入Bean,此两个Bean为引用关系
注入相关注解
- @Autowired:按照类型自动装配对象,如果一个类型对应多个对象则可使用@Qualifier,@Qualifier的作用就是可以通过名称自动装配
- @Resource:该注解先通过名称进行装配,若没有声明name则根据类的类型进行装配,顺序与@Autowired相反
- @Bean:主要用在@Configuration注解的类里,也可以用在@Component注解的类里,我们通过查看@Bean的元注解可以看到,他只能作用在其他注解或者类的方法上,Bean默认的名称为方法名,也可自定义名称与别名
- @Component:用于标记类为Spring管理的组件的一种方式,通过该注解可以将普通的java类变成IOC容器中的一个Bean。该注解是一个泛型注解,可以用于标记任何类型的组件,他有几个常用的、用于不同场景的子注解例如:@Repository,@Service,@Controller等
BeanFactory
BeanFactory是Spring IOC的本质,他的存在解决了bean的生产于管理,并且Spring还将bean的各个生命周期阶段的管理接口暴露给我们,我们只需要实现这些接口那么在bean的生命周期阶段中,spring就会调用我们的接口实现去对bean做出相应处理。
Spring通过BeanDefinitionReader通过扫描我们项目中使用了@Component或者@Configuration注解的类,获取到BeanDefintiions,将他们注册到BeanFactory中。BeanFactory通过conCurrentHashMap存储bean的信息,key即为bean的名称,Value就是BeanDefintiions,BeanDefintiions就是Bean的一些元数据,比如类名、是否抽象等定义。
实现BeanFactory的实现类有多种,具体细节与取舍可以参考源码或者官方文档查看
总结
到这里我们其实对Spring IOC已经有了一个自己的理解,其实就是我们把类通过不同的方式注入到容器中,我们代码中只需要拿到这个bean然后去用就可以了,至于对象的生命周期都交给了我们的IOC容器去管理。
感谢各位大佬的光临,Spring IOC的细节有很多,每一个点都可以拿出来单独写一篇博客了,因此此篇博客以较为精简的介绍为主,想要探究更深层次的细节可以通过结合官方文档的介绍与源码去理解,好了不说废话了,再次感谢各位大佬能看到这里,如果该文章由任何问题欢迎各位大佬指出,谢谢