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也是这么做的。就是工厂的生产方式