spring框架的下载
spring的下载地址
网速不好的话,进去的时候可能又有点慢。
进入Artifacts
根据路径依次进入:libs-release-local/org/springframework/spring/
然后就可以看见好多版本
这里面发布的版本都是稳定的,我就选个最新版吧。
下载版本里的第一个压缩包就行了
环境搭建
添加jar包
要加载spring框架的最基本的四个jar包,就是在图中Core Container模块中的四个jar包。
在刚下载的spring框架中libs文件夹中可以看见spring框架中所具有的jar包。
图中的SpEL就是指名字叫expresion的jar包。
再加上记录日志的jcl包,相当于需要添加5个基本jar包。
在添加jar包时注意,在存放jar包的文件夹中,有跟jar包名字很相似的javadoc.jar包和sources.jar包,这两个就不要添加了。
简单测试程序
ISomeService.java接口
public interface ISomeService {
void doSome();
}
SomeServiceImpl.java实现类
public class SomeServiceImpl implements ISomeService {
@Override
public void doSome() {
System.out.println("执行doSome()方法");
}
}
测试类
public class MyTest {
@Test
public void test01() {
ISomeService service = new SomeServiceImpl();
service.doSome();
}
}
在测试类中可以看出,我在测试类中还需要创建SomeServiceImpl类的对象,这就存在着类之间的耦合。
所以使用spring中提供的容器,就可以解决业务逻辑之间的耦合。
xml文件约束
创建一个xml文件,命名为applicationContext.xml,作为spring的容器,在这个容器中完成对象的创建工作。首先需要为其添加约束
<?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">
</beans>
ApplicationContext容器
通过容器创建对象
<?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">
<!--
下面的配置相当于
ISomeService someService = new SomeServiceImpl();
其底层的执行是
Object someService = Class.forName(com.service.SomeServiceImpl).newInstance();
-->
<bean id="someService" class="com.service.SomeServiceImpl"/>
<!--class中放的是类的全限定名-->
</beans>
底层是用到了反射的原理创建的对象。
现在容器中有了对象,下面就是需要对象的时候怎么从容器中取出对象。
通过容器取出对象
测试类
@Test
public void test02() {
//传入创建对象的容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//获得id名为someService的bean
ISomeService service = (ISomeService) ac.getBean("someService");
service.doSome();
}
这样在测试类中就完全不依赖接口实现类了,这就完成了两个类之间的解耦。
三种构造方法
上面的getBean()可以使用的三种构造方法。
上面是一种,还有两种
@Test
public void test03() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//适用于只有一个实现类,即容器中只有一个class="com.service.SomeServiceImpl"的bean
ISomeService service = (ISomeService) ac.getBean(ISomeService.class);
service.doSome();
}
@Test
public void test04() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ISomeService service = (ISomeService) ac.getBean("someService",ISomeService.class);
service.doSome();
}
ApplicationContext的两个实现类
上面使用的是ClassPathXmlApplicationContext();实现类。
另一个实现类叫做FileSystemXmlApplicationContext();
@Test
public void test05() {//applicationContext的另一个实现类
ApplicationContext ac = new FileSystemXmlApplicationContext("I:\\eclipse project\\Workspace\\1_1第一个Spring项目\\src\\applicationContext.xml");
ISomeService service = (ISomeService) ac.getBean("someService",ISomeService.class);
service.doSome();
}
这个实现类是通过系统的路径下寻找spring的配置文件。
通常使用的就是ClassPathXmlApplicationContext这个实现类,比较方便。
BeanFactory容器
BeanFactory的使用方式
@Test
public void test06() {//Spring框架的第二个容器
BeanFactory ac = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
ISomeService service = (ISomeService) ac.getBean("someService",ISomeService.class);
service.doSome();
}
BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了种 bean 的定义,以便在接收到客户端请求时将对应的 bean 实例化。
BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将 bean 自身与 bean 客户端的配置中解放出来。BeanFactory 还包含 了 bean 生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
XmlBeanFactory这种方式获取配置文件基本上被淘汰,是比较接近底层了,我们只需要知道有这种使用方式就可以了,大多情况下还是使用的是他的子接口ApplicationContext。
两个容器的区别
ApplicationContext与BeanFactory容器的区别:
-
ApplicationContext容器:(开发中常用) 当容器被创建时,会自动将该容器中所有的Bean创建
优点:对用户的响应效率高,用户体验好
不足:消耗和占用系统资源 -
BeanFactory容器:
容器被创建时,不会自动创建该容器中的Bean,只有当真正使用到该Bean时,才会有容器创建
优点:节省系统资源
不足:对用户的响应效率相对较低
从表面上看,application context 如同 bean factory 一样具有 bean 定义、bean 关联关系的设
置,根据请求分发 bean 的功能。但 applicationcontext 在此基础上还提供了其他的功能。
- 提供了支持国际化的文本消息
- 统一的资源文件读取方式
- 已在监听器中注册的 bean 的事件
IoC的本质
-
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为 DI只是IoC的另一种说法。没有IoC的程序中, 我们使用面向对象编程 ,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
-
IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。 -
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。