Spring回顾之一

一.基础准备

IoC是什么

Ioc—Inversion of Control,即“控制反转”,不是什么技术,一种设计思想。 传统的Java编程中,如果应用程序需要依赖对象,需要通过new来实现。在IoC中,所有的设计好的对象都是通过容器进行控制的。下面需要理解几个问题:

  1. 谁控制谁,控制什么:IoC容器控制对象的创建。控制什么,主要是控制外部资源的获取(不仅限于对象)。
  2. 为何是反转:传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象。为何是反转?因为容器帮我们查看和注入依赖对象,对象被动的接受依赖对象。

DI是什么

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。通过依赖注入我们可以简单的通过配置或者是注解,即可为目标对象注入需要的资源,完成自身的业务逻辑。

Bean的概念

由IoC容器管理的组成应用程序的对象就叫Bean,Bean是由Spring容器(IoC容器)进行初始化,装配以及管理的对象。

二.Spring入门

  1. 详解IoC容器

在spring中IoC容器的代表就是org.springframework.beans中的BeanFactory接口,BeanFactory提供了IoC容器的基本功能;在org.springframework.context下的ApplicationContext扩展了BeanFactory(BeanFactory继承了ListableBeanFactory接口,而ListableBeanFactory继承了BeanFactory接口),还提供了与Spring AOP的集成、国际化处理、事件的传播和提供不同层次的context实现。综上:BeanFactory提供了IoC容器的基本功能,而ApplicationContext提供了更多企业级功能的支持。
BeanFactory容器一览:

XmlBeanFactory:BeanFactory实现,提供基本的IoC容器功能,可以从classpath或文件系统等获取资源;

1
2
3
4
5
6
File file = new File("fileSystemConfig.xml");
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
Resource resource = new ClassPathResource("classpath.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);

ClassPathXmlApplicationContext:ApplicationContext实现,从classpath获取配置文件;

1
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");

FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件。

1
BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystemConfig.xml");
  1. IoC容器执行流程

image

  • 首先是在配置文件中声明Bean的定义,为Bean配置元数据。
  • 由IoC容器的Bean Reader读取并解析配置文件,通过BeanDefinition配置元数据,IoC容器根据BeanDefinition进行实例化、配置以及组装Bean。
  • 由应用程序实例化IoC容器,得到Bean对象。
  1. 小案例测试
  • 创建接口
1
2
3
public interface IHelloSpring {
public void sayHello();
}
  • 创建实现类
1
2
3
4
5
public class HelloSpringImpl implements IHelloSpring {
void sayHello() {
System.out.println("Hello Spring");
}
}
  • 配置文件
1
2
3
4
5
6
<?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="hello" class="com.study.hello.HelloSpringImpl"></bean>
</beans>
  • 编写测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
public class HelloSpringTest {
@Test
public void test(){
ApplicationContext context=
new ClassPathXmlApplicationContext("classpath:HelloSpring.xml");
//从容器中获取bean,面向接口编程
IHelloSpring hello = context.getBean("hello", IHelloSpring.class);
IHelloSpring hello1 = (IHelloSpring) context.getBean("hello");
hello.sayHello();
hello1.sayHello();
}
}
  1. 小结

在测试代码中除了程序的入口,其他的地方没有Spring的任何组件,也没有实现Spring框架的任何接口。在代码编写完全是面向接口编程的,使用时不需要知道接口的实现类,需要修改实现类时,可以通过配置文件进行修改。