spring

spring有以下特点:

1、非侵入式:基于spring开发的应用不依赖于spring的API,即使更换框架也可以继续使用

2、控制反转:IOC是指将对象的创建权交给Spring去创建,在spring之前对象的创建都是由我们自己在代码中new得,而spring之后都是由框架创建。

3、依赖注入:DI是指依赖的对象不需要手动的setXXX方法,而是通过配置赋值

4、容器:spring是一个容器,它包含并且管理应用对象的生命周期

ICO

  在没有spring之前,当你需要一杯橙汁时,你需要自己创造,此时你需要杯子、糖、橙子等,但这是在有了spring之后你仅仅需要把自己的要求提给spring,这时你并没有自己动手创造,但是却得到了一杯橙汁

package pojo;

public class Source {  
    private String fruit;   // 类型
    private String sugar;   // 糖分描述
    private String size;    // 大小杯    
    /* setter and getter */
}

在src目录下配置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 name="source" class="pojo.Source">
        <property name="fruit" value="橙子"/>
        <property name="sugar" value="多糖"/>
        <property name="size" value="超大杯"/>
    </bean>
</beans>

package test;

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

public class TestSpring {

    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"applicationContext.xml"}
        );

        Source source = (Source) context.getBean("source");
        System.out.println(source.getFruit());
        System.out.println(source.getSugar());
        System.out.println(source.getSize());
    }
}

DI

是指spring创建对象的过程中,将对象依赖属性通过配置设置给该对象

package pojo;

public class JuiceMaker {

    // 唯一关联了一个 Source 对象
    private Source source = null;

    /* setter and getter */

    public String makeJuice(){
        String juice = "xxx用户点了一杯" + source.getFruit() + source.getSugar() + source.getSize();
        return juice;
    }
}

<?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 name="source" class="pojo.Source">
        <property name="fruit" value="橙子"/>
        <property name="sugar" value="多糖"/>
        <property name="size" value="超大杯"/>
    </bean>
    <bean name="juickMaker" class="pojo.JuiceMaker">
        <property name="source" ref="source" />
    </bean>
</beans>

package test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.JuiceMaker;
import pojo.Source;

public class TestSpring {

    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"applicationContext.xml"}
        );

        Source source = (Source) context.getBean("source");
        System.out.println(source.getFruit());
        System.out.println(source.getSugar());
        System.out.println(source.getSize());

        JuiceMaker juiceMaker = (JuiceMaker) context.getBean("juickMaker");
        System.out.println(juiceMaker.makeJuice());
    }
}

spring

 假设没有依赖注入功能,我们一般会通过下面几步完成

1、读取标注或者配置文件,看看juiceMaker依赖的是那个Source,拿到类名

2、使用反射API,基于雷鸣实例化对应的对象实例

3、通过实例的getter和setter方法传递给JuiceMaker

其实spring也是这么做的。就是工厂的生产方式

部分借鉴https://www.cnblogs.com/wmyskxz/p/8820371.html

相关推荐