Spring Framework (二) -- IOC

Spring Framework (二)

本篇博客的主要内容是介绍Spring框架中的一个核心:IOC

1. 什么是IOC?

IoC:Inversion of Control,控制反转。是一种思想,即将创建对象的控制权交给外部环境(如:交给Spring框架)。

2. 为什么要有IOC?

传统创建对象或实例化的方式是通过关键字new来实现,这种方式存在的弊端是耦合度高。软件设计追求的是高内聚低耦合,因此提出了用IoC容器(Spring)来实例化对象

IoC思想就是将对象的控制权交给IoC容器管理,在使用的时候直接向IoC容器要即可

在Spring中用来实现IoC的载体就是IoC容器,实际上是Map,存放着各种对象。

3. 如何实现IOC?

Ioc核心思想就是把对象的控制权(包括创建和调用对象)交给IoC容器。

Spring框架中,如何创建一个对象?

  • 第一步:在xml文件中利用bean标签配置创建的对象,bean标签中包括两个关键属性,分别是id和class。id指的是对象的唯一标识,class指的是类标识。
<bean id="对象标志" class="欲创建对象所属类的全限定名"></bean>
全限定名指的是:目标类编译后class文件所在位置
  • 第二步:创建工厂类,工厂类中写一个静态方法来获取对象,解析xml文件,读取class属性值,得到目标类的全限定名。

  • 第三步:用反射创建类的对象。

Spring中怎么实现IOC容器?

Spring中提供两种实现IOC容器的实现方式:

  • BeanFactory接口Spring内部使用的接口,不提供给开发人员使用

    特点:加载配置文件时不创建对象,获取对象时才会创建对象

  • ApplicationContext接口:BeanFactory子接口,由开发人员使用

    特点:加载配置文件时就创建对象

    ApplicationContext接口的两个实现类:

    • FileSystemXmlApplicationContext:构造器参数需要传入xml配置文件编译后的绝对路径

    • ClassPathXmlApplicationContext:构造器参数需要传入xml配置文件编译后的相对路径

//绝对路径
ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\code\\spring-01\\target\\classes\\beans.xml");

//相对路径
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

【总结】控制反转是一种思想,是能够解决问题的一种可能的结果,而依赖注入(Dependency Injection)就是其最典型的实现方法。由第三方(我们称作IOC容器)来控制依赖,把他通过构造函数、属性或者工厂模式等方法,注入到类A内,这样就极大程度的对类A和类B进行了解耦。

IoC典型的实现方式叫做DI:Dependency Injection,依赖注入。
依赖:对象合作的其他对象

创建对象之后,给对象属性赋值需要使用依赖注入

4. 如何实现属性注入?

实现属性注入一般有两种方式:基于注解的注入属性和基于xml注入属性。

4.1 基于注解的注入属性

  • 定义:使用Spring中的注解完成属性赋值

  • 常用注解

    @Component:相当于bean标签,用于创建对象
    @Repository:用于持久层类创建对象
    @Service:用于业务层类创建对象
    @Controller:用于控制器类创建对象
    @Value:给简单类型属性赋值,用于属性注入
    @Autowired:引用类型属性注入(自动注入byType)
    @Qualifier:与Autowired合用,属性自动注入,byName
    @Resource:自动注入,支持byName和byType,默认是byName

  • 怎么利用注解注入属性?

Step 1 : 利用注解component创建对象

Step 2 : 组件扫描器扫描

4.2 基于xml的注入属性

基于xml的注入属性共有三种注入方式:set注入,构造注入以及自动注入。

  • set注入:Spring调用类的set方法,set方法中实现属性的赋值

    • 注入简单类型(如:基本数据类型,String)
    • 注入引用类型

[注入简单类型代码]

[注入引用类型代码]

  • 构造注入:: Spring调用类的有参构造方法,在构造方法中完成赋值(<constructor - arg>标签)

  • 自动注入

    • 按名称注入(byName)
    • 按类型注入(byType)

[按名称注入]

【注】自动注入允许引用类型属性不用ref来指明类型

[按类型注入]

参考资料

https://www.cnblogs.com/TSCCG/p/15363241.html
https://zhuanlan.zhihu.com/p/33492169

posted @ 2022-07-04 21:21  Claire_2099  阅读(53)  评论(0编辑  收藏  举报