• 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>
  • 相关阅读:
    MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)
    Kth Minimum Clique(2019年牛客多校第二场D题+k小团+bitset)
    Removing Stones(2019年牛客多校第三场G+启发式分治)
    Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)
    Rikka with Travels(2019年杭电多校第九场07题+HDU6686+树形dp)
    二维平面数点
    Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)
    Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)
    Find the median(2019年牛客多校第七场E题+左闭右开线段树)
    Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6718389.html
Copyright © 2020-2023  润新知