Spring之IOC和DI

Posted zhangyi0331

tags:

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

一、Spring是什么?

  Spring是一个框架,Java不死的原因是因为Java有Spring这个非常强大的技术框架的支持,而且他是一个轻量级的Java开发框架

二、什么是IOC?

  一、IOC的意思:控制反转(全称Inversion of Control)

    他是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,也是轻量级的Spring框架的核心

    那么如何理解这句话呢?

    第一种理解:将组建对象的控制权从代码本身转移到外部容器

    第二种理解:将创建对象实力的控制权从代码控制剥离到IOC容器控制

  二、案例

      引入jar包(引节点)

<!--Spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>

        <!--aop使用的jar-->
        <dependency>
            <groupId> org.aspectj</groupId >
            <artifactId> aspectjweaver</artifactId >
            <version> 1.8.7</version >
        </dependency>

    里面一共有五个jar包(前两个节点有两个jar包)

      技术分享图片

    创建一个类。

package demo01;

import java.util.StringTokenizer;

**
 * Create Time: 2018年03月05日 16:28
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
public class HappyService {
    private String info;
    private Integer age;

    public HappyService(){
        System.out.println("======HappyService");
    }

    public void work(){
        System.out.println("我是"+info);
    }

    public String getInfo() {
        return info;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

  写ApplicationContext.xml文件

<?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="service" class="demo01.HappyService">
        <property name="info" value="第一个Spring项目"></property>
        <property name="age" value="10"></property>
    </bean>
</beans>

  测试类:

import demo01.HappyService;
import demo03.printer.Printer;
import demo03.printer.Printer;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Create Time: 2018年03月05日 16:35
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
public class Test20180303 {
    @Test
    public void t1(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        HappyService service =(HappyService) context.getBean("service");
        service.work();
    }


}

  测试结果:

====HaapyService
我是第一个Sring项目

三、什么是DI

  Dependency Injection  依赖 注入   给对象注入属性值

  IOC和DI的区别:

    IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理。

    DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。它们是spring核心思想的不同方面的描述。

  案例 打印机

    1.编写墨盒接口

package cn.spring.day03printer.ink;
//磨盒的接口
public interface Ink {
    public String getColor();
}

    2.两个种墨盒

  

package cn.spring.day03printer.ink;

/**
 * Create Time: 2018年03月05日 20:03
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
public class BlackInk implements Ink {
    //黑白墨盒        
    public String getColor() {
        return "BlackIkn";
    }
}

    

package cn.spring.day03printer.ink;

/**
 * Create Time: 2018年03月05日 20:07
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
    //彩色墨盒
public class ColorInk implements Ink {
    public String getColor() {
        return "ColorIkn";
    }
}

    3.纸张接口和他的实现类

package cn.spring.day03printer.paper;
//纸张
public interface Paper {
    public String getPaprSize();
}

  

package cn.spring.day03printer.paper;
/**
 * Create Time: 2018年03月05日 20:13
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
//A4纸
public class A4aper implements Paper {
    public String getPaprSize() {
        return "A4paper";
    }
}

  

package cn.spring.day03printer.paper;
/**
 * Create Time: 2018年03月05日 20:15
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
//B5的纸
public class B5Paper implements Paper {
    public String getPaprSize() {
        return "B5Paper";
    }
}

  4.编写打印机类

package cn.spring.day03printer.printer;
import cn.spring.day03printer.ink.Ink;
import cn.spring.day03printer.paper.Paper;
/**
 * Create Time: 2018年03月05日 20:18
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
//打印机
public class Printer {
    private Ink ink;
    private Paper paper;
    public void print(){
        System.out.println("使用"+paper.getPaprSize()+"\\t"+ink.getColor()+"墨盒,打印");
    }
    public Ink getInk() {
        return ink;
    }
    public void setInk(Ink ink) {
        this.ink = ink;
    }
    public Paper getPaper() {
        return paper;
    }
    public void setPaper(Paper paper) {
        this.paper = paper;
    }
}

  5.Xml文件配置

<?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">
<!--在Spring中定制一个Ink-->
    <bean id="ink" class="cn.spring.day03printer.ink.ColorInk">
    </bean>
    <bean id="paper" class="cn.spring.day03printer.paper.A4aper">
    </bean>
    <bean id="printer" class="cn.spring.day03printer.printer.Printer">
        <property name="paper" ref="paper"></property>
        <property name="ink" ref="ink"></property>
    </bean>
</beans>

  6.测试类

import cn.spring.day03printer.printer.Printer;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Create Time: 2018年03月05日 20:29
 * [email protected] 张晓北
 * My motto :Do not , for one repulse , give up the purpose that you resolved to effect
 **/
public class Text03 {
    @Test
    public void t1(){
        ApplicationContext contest=new ClassPathXmlApplicationContext("applicationContext-day03printer.xml");
        Printer printer=(Printer)contest.getBean("printer");
        printer.print();
    }
}

  运行结果:

三月 07, 2018 20:32:25 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org[email protected]7c883540: startup date [Wed Mar 07 19:51:25 CST 2018]; root of context hierarchy
三月 07, 2018 20:32:25 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext-day03printer.xml]
使用A4paper	ColorIkn墨盒,打印

Process finished with exit code 0

  

 

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

Spring之IOC与DI注解

Spring之IOC和DI

Java--Spring之IoC控制反转;基于XML配置文件的DI

Java开发Spring之IOC详解第一篇(xml开发常用APIben标签DI依赖注入)

spring 之 DI

Java之Spring入门到精通IDEA版IoC和DI注解开发(一篇文章精通系列)