smalllove 2020-02-12
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()); } }
假设没有依赖注入功能,我们一般会通过下面几步完成
1、读取标注或者配置文件,看看juiceMaker依赖的是那个Source,拿到类名
2、使用反射API,基于雷鸣实例化对应的对象实例
3、通过实例的getter和setter方法传递给JuiceMaker
其实spring也是这么做的。就是工厂的生产方式