码迷,mamicode.com
首页 > 编程语言 > 详细

spring——IoC控制反转

时间:2020-03-11 16:59:47      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:ram   修改   version   第三方   生产   oid   map容器   生命周期   总结   

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

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控制反转

标签:ram   修改   version   第三方   生产   oid   map容器   生命周期   总结   

原文地址:https://www.cnblogs.com/huangdajie/p/12463374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!