spring——IoC控制反转

Posted 黄大姐の老公

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring——IoC控制反转相关的知识,希望对你有一定的参考价值。

遇见,拉着你的手,无论是在哪里,我都感觉像是朝天堂奔跑,你相信么?

Spring IOC控制反转

1、概述

Spring有IOC和AOP两个核心。其中IOC就是我们说的控制反转,也就是将创建对象并生命周期管理过程交给Spring处理,在开发中不再需要关注对象的创建和生命周期的管理,需要时由Spring框架提供,这个由Spring管理创建对象和生命周期的机制称为控制反转。创建对象的权力转给框架,他帮我们创建,我们不再使用new关键字来创建对象

2、原理

2.1 创建过程

在初始化一个Spring容器时,Spring会解析Spring的配置文件(applicationContext.xml),从上到下解析到时,根据标签中的class属性指定的类的全路径名找到该类并通过反射来创建该类的对象,并把创建的对象存入到内置的Map容器中管理,其中存入map中的键是该标签中的id值,值是创建的对象

2.2 获取对象过程

当通过context.getBeans("id值")方法来从容器中获取对象时,根据id从内置的map中寻找是否有匹配的键值,如果有则返回对象,如果没有则抛出异常

注意:默认情况下,多次获取同一id的bean对象得到的是同一个对象(默认情况下创建的对象是单例的,如果需要多例可以在该标签中设置多例)。如果使用一个类配置多个标签设置不同的id,每个id都会在内置Map中有一个键值对,其中的值是这个类创建的不同的对象。同一个标签下不运行配置多个同id的,如果配置则会报错

3、IOC本质

控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方式,也有人认为DI只是IOC的另一种说法。没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的母的

控制反转是一种通过描述(XML或注解)并通过第三方去生产和获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方式是依赖注入(Dependency Injection,DI)

4、HelloSpring

思考:

  • Hello对象是由谁创建的【hello对象是由Spring创建的】
  • Hello对象的属性是怎么设置的【hello对象的属性是由Spring容器设置的】

这个过程就叫控制反转:

  • 控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的
  • 反转:程序本身不创建对象,而变成被动的接收对象

依赖注入:就是利用set方法来进行注入的

IOC是一种编程思想,由主动的编程变成被动的接收

通过newClassPathXmlApplicationContext浏览底层源码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="mysqlImpl" class="com.xiaohua.dao.impl.UserDaoMySqlImpl"/>
    <bean id="OracleImpl" class="com.xiaohua.dao.impl.UserDaoOracleImpl"/>

    <bean id="ServiceImpl" class="com.xiaohua.service.impl.UserServiceImpl">
        <!--注意: 这里的name并不是属性 , 而是set方法后面的那部分 , 首字母小写-->
        <!--引用另外一个bean , 不是用value 而是用 ref-->
        <property name="userDao" ref="OracleImpl"/>
    </bean>
</beans>

测试:

@Test
public void test2(){
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("ServiceImpl");
    serviceImpl.getUser();
}

OK,到了现在,我们彻底不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定:对象由Spring来创建、管理、装配

5、IOC创建对象的方式

  • 使用无参构造创建对象,默认

  • 假设我们要使用有参构造创建对象

    • 下标赋值

      <!--第一种,下标赋值-->
      <bean id="user" class="com.xiaohua.pojo.User">
          <constructor-arg index="0" value="黄大姐你好"/>
      </bean>
    • 通过类型赋值

      <!--第二种方式:通过类型创建,不建议使用-->
      <bean id="user" class="com.xiaohua.pojo.User">
          <constructor-arg type="java.lang.String" value="黄二姐"/>
      </bean>
    • 通过属性名赋值

      <!--第三种,直接通过参数名实现赋值-->
      <bean id="user" class="com.xiaohua.pojo.User">
          <constructor-arg name="name" value="黄三姐"/>
      </bean>

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了

以上是关于spring——IoC控制反转的主要内容,如果未能解决你的问题,请参考以下文章

Spring核心(ioc控制反转)

spring------控制反转(IOC)/依赖注入(DI)

Spring中的IoC(控制反转)具体是什么东西

Spring IOC(控制反转)示例解析

Spring的控制反转(IOC)学习

[Js-Spring]Spring与IoC(控制反转,Inversion of Control)