day38 03-Spring的IOC和DI的区别

Posted 绿茵好莱坞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day38 03-Spring的IOC和DI的区别相关的知识,希望对你有一定的参考价值。

在IOC中有一个DI的概念。

IOC是控制反转,DI是依赖注入。现在编写的类里面是没有其他的属性的。如果你学过像UML设计的话,


电视没有遥控器,按按钮也可以,但是紧密的那种,像人和四肢,人如果没有了四肢人就废了。部门和领导,部门没有领导,照样可以存在,这种属于松散的。但是人和脑袋,这种关系就是紧密的了。你不能离开它而单独的存在。所以说聚合里面也是有这两种的,你简单了解一下就行了。

依赖:一个对象里面需要用到另外一个对象。

public class A{//A依赖了b

    private B b;//b也是另外一个单独的对象  属性b

}

这种依赖通常是指方法的参数。你需要在方法A里面写一个setB()把b传进来。

DI需要IOC的,你得在IOC的基础上。将对象的创建权,由Spring来管理。也就是说那个HelloService你不需要自己去创建了,Spring可以帮你创建。DI依赖注入在Spring创建对象的过程中,把对象依赖的属性注入到类中.

A这个类得在Spring中配置。你配置一下之后Spring就帮我把这个A创建好了。那么A依赖的这个b呢,它会不会一并创建并且把它的值也给它设置上呢?这个过程叫做依赖注入。它是里面的这些个值想被赋值也想给它一并带过来的话那么就需要使用依赖注入。

 


IOC是创建对象,把创建对象的控制权呢交给Spring了,DI是我们创建这个对象的时候这个对象依赖的其他属性Spring也会帮你注入进来。

package cn.itcast.spring3.demo1;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest1 {
    @Test
    //传统方式
    public void demo1(){
        //造成程序紧密耦合.
        //应该采用工厂+配置文件+反射的机制
        HelloService helloService = new HelloServiceImpl();
        helloService.sayHello();
    }
    @Test
    //Spring开发
    public void demo2(){
        //创建一个Spring的工厂类.
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //ApplicationContext就是Spring的工厂类
        //不写applicationContextx.xml的全路径,默认会去WEB-INF下面找applicationContextx.xml
        //但是现在applicationContextx.xml写好之后已经发布到WEB-INF的classes里面
        HelloService helloService = (HelloService) applicationContext.getBean("helloService");
        helloService.sayHello();
    }
}
package cn.itcast.spring3.demo1;
/**
 * 入门案例的实现类
 * @author ZhongZhenhua
 *
 */
public class HelloServiceImpl implements HelloService{
    private String info;

    public void setInfo(String info) {
        this.info = info;
    }

    public void sayHello(){
System.out.println("Hello Spring...."+info);
}
}
package cn.itcast.spring3.demo1;
/**
 * 入门案例:
 * @author ZhongZhenhua
 *
 */
public interface HelloService {
    public void sayHello();
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 别去schema,schema是文件,本地的文件,你得引那个头 -->

<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属性为类起个标识. -->
    <!-- 接口,实现类,配置文件也都有了 -->
    <!-- 现在有一个工厂Spring为我们提供好了,其实就是解析这个XML文件 -->
    <!-- 这个工厂你自己写会不会写?你用dom4j找里面的bean标签,找到class的属性值,然后就可以Class.forName()反射生成类的实例.其实Spring
         也是这么做的,只不过工厂由Spring提供好了
     -->
    <bean id="helloService" class="cn.itcast.spring3.demo1.HelloServiceImpl">
         <!-- 使用<property>标签注入属性 
         value指的是普通值
         ref指的是对象
         -->
    <property name="info"  value="传智播客"></property>
    </bean>
</beans>

 

以上是关于day38 03-Spring的IOC和DI的区别的主要内容,如果未能解决你的问题,请参考以下文章

阶段3 2.Spring_03.Spring的 IOC 和 DI_5 BeanFactory和ApplicationContext的区别

Spring-03.Spring的 IOC 和 DI

阶段3 2.Spring_03.Spring的 IOC 和 DI_1 ioc的概念和作用

阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备

阶段3 2.Spring_03.Spring的 IOC 和 DI_1 ioc的概念和作用

阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门