欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

框架之Spring-控制反转,依赖注入(IOC原理)

程序员文章站 2024-02-29 10:03:04
...

为了记录和复习所学的知识,博主决定写成博文记录下来,也是入门小白,如有不足之处,还请各位不吝指正,就在此先谢过啦!

今天呢,想说说Spring框架,说这个之前呢,我们先理解一下什么是“框架”,哈哈,毕竟博主也是一个小白起步。
所谓的框架其实就是程序的架子,在这个程序的架子中,搭建起程序的基本的骨架,针对程序的通用问题给出了便捷的解决方案,可以使开发人员 基于框架快速开发具体的应用程序。常见的框架有SSH(Struts2+Spring+Hibernate)、SSM(SpinrgMVC+Spring+Mybatis)。
其中Spring是主流的框架之一,所以我们来看看Spring到底怎么用。
其实常常在面试的时候,面试官也会经常问道:请你谈谈对Spring的理解。那博主想说,照着下面的知识点回答应该是不会有大问题的!!

首先,要指出的是,Spring是一个Service层(经典三层架构)的框架,其次,它主要依赖的技术分别是IOC(DI)、AOP。
IOC(DI):控制反转(依赖注入)
AOP:面向切面编程

接下来就从这两个点分别介绍。
第一点:IOC/DI
IOC被称作控制反转,其含义就是我们在开发过程中不需要再关注对象的创建以及对象生命周期,而是将对象创建的权力和对对象生命周期的管理权交给Sping框架来管理,当我们需要 适用对象的时候,直接由Spring框架提供。
在创建对象过程中 ,我们可以通过Spring配置对对象的属性进行配置,这个过程就是依赖注入(DI)。
后面会提到用注解方式来实现IOC和DI,简直不要太方便!
IOC的原理: 在初始化一个Spring容器时,Spring会去解析指定的xml文件,当解析到其中的标签时,会根据该标签中的class属性指定的类的全路径名,通过反射创建该类的对象,并将该对象存入内置的Map中管理。其中键就是该标签的id值,值就是该对象。
之后,当通过getBean方法来从容器中获取对象时,其实就是根据传入的条件在内置的Map中寻找是否有匹配的键值,如果有则将该键值对中保存的对象返回,如果没有匹配到则抛出异常。

举一个简单的例子,帮助大家理解,将创建好的bean在spring配置文件中配置,把bean对象交由spring管理。
框架之Spring-控制反转,依赖注入(IOC原理)
通过spring获取对象
框架之Spring-控制反转,依赖注入(IOC原理)
其中将bean交由spring管理这一操作,就叫控制反转。

既然创建了对象,我们就需要了解一下他底层的一个创建过程吧,我想这应该也是面试官想要知道的。
Spring 创建对象的方式有四种:无参构造(默认)、静态工厂、实列工厂、spring工厂。
无参构造:这种方式下spring创建对象,要求类必须有无参的构造,否则无法通过反射创建对象,会抛出异常。
静态工厂:如果遇到没有无参构造、是一个抽象类等情况 ,spring无法通过无参构造创建对象,此时可以使用静态工厂 方式创建对象。
框架之Spring-控制反转,依赖注入(IOC原理)
框架之Spring-控制反转,依赖注入(IOC原理)
框架之Spring-控制反转,依赖注入(IOC原理)
实列工厂:实例工厂也可以解决类是无法通过无参构造创建的问题,解决的思路和静态 工厂类似,只不过实例工厂提供的方法不是静态的。spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。
框架之Spring-控制反转,依赖注入(IOC原理)
spring工厂:Spring内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。这个不太熟,就不贴代码了????

此外,我们还的了解创建好的对象,生命周期是怎样的。这里就涉及到单例和多例模式了。在spring中创建对象,默认采用的单例模式,即一个bean只会创建一个对象,后面无论获取多少次,都返回同一个对象。我们可以通过scop=“prototype”来设置成多例模式,多例模式下,获取一次该对象,就创建一次对象,并返回该对象,每次都是一个新的对象。
所以单例模式和多例模式创建的对象的生命周期是不同的,
框架之Spring-控制反转,依赖注入(IOC原理)
用注解来实现IOC和DI(面试的话,个人觉得这部分可以略过)
Spring除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,修改更方便,推荐使用。
第一步,需要开启包扫描,属性注解
<context:component-scan base-package=“cn.tedu.beans”></context:component-scan>
context:annotation-config</context:annotation-config>
第二步,使用注解注册bean,添加属性
这个包中的类会在spring容器启动时自动被扫描,检测是否需要自动配置为bean.
在配置的包中的类上使用**@Component**注解,则这个类会自动被注册为bean

@Component
public class Person{
	@Value("999")
	private int id;	
	@Value("zs")
	private String name;
	}

总结:其实在spring中的IOC/DI很好的实现了分层解耦的目的,大家都知道,在开发中,为了便于工作分工和代码的维护,一直追求“高内聚,低耦合”,而IOC/DI在web开发中就很好的满足这一点。之后再继续介绍吧,越写越多了,哈哈。
至于AOP部分,我会分到下篇来讲。
希望大家可以一起探讨,相互学习。????
如果需要相关资料,也可以告诉我,之后整理了分享出来

相关标签: spring ioc java