IOC容器概念
ioc容器就是具有依赖注入功能的容器,ioc容器负责实例化,定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需在代码中new相关对象,应用程序由ioc容器进行组装。BeanFactory是ioc容器的实际代表者。
ioc容器是如何知道它管理的对象的?
通过读取配置文件的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。
Bean的概念
由Ioc容器管理的那些组成应用程序的对象,在Spring中称之为Bean,Bean由Spring容器初始化,装配及管理。Bean就是普通的java对象。
ioc如何实例如何实例化bean
需要配置元数据,在Spring中用BeanDefinition代表
例子
项目的结构图
创建一个接口
public interface HelloApi {
public void sayHello();
}
创建一个实现类
public class HelloImp implements HelloApi {
@Override
public void sayHello() {
System.out.println("hello world");
}
}
接口和实现类都开发好了,那如何使用ioc容器来管理呢?
<?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-3.1.xsd
http://www.springframework.org/schema/context">
<bean id="hello" class="imp.HelloImp"></bean>
</beans>
测试
public class HelloTest {
@Test
public void testHelloApi() {
//1.读取配置文件获得一个IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("helloWorld.xml");
//2.从IOC容器中获取Bean,这里是完全根据"面向接口,而不是面向实现"
HelloApi api = context.getBean("hello", HelloApi.class);
//3.执行业务逻辑
api.sayHello();
}
}
ioc容器详解
容器实现一览
(1)
public void testHelloApi() {
//1.读取配置文件获得一个IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("helloWorld.xml");
//2.从IOC容器中获取Bean,这里是完全根据"面向接口,而不是面向实现"
HelloApi api = context.getBean("hello", HelloApi.class);
//3.执行业务逻辑
api.sayHello();
}
(2)
public void testHelloApi1() {
File file = new File("/Users/zhanghanbin1990/Project/spring_source_study/src/main/resources/helloWorld.xml");
Resource resource = new FileSystemResource(file);
BeanFactory factory = new XmlBeanFactory(resource);
HelloApi api = factory.getBean("hello",HelloApi.class);
api.sayHello();
}
(3)
public void testHelloApi2(){
Resource resource = new ClassPathResource("helloWorld.xml");
BeanFactory factory = new XmlBeanFactory(resource);
HelloApi api = factory.getBean("hello",HelloApi.class);
api.sayHello();
}
(4)
@Test
public void testHelloApi3() {
BeanFactory factory = new FileSystemXmlApplicationContext("src/main/resources/helloWorld.xml");
HelloApi api = factory.getBean("hello",HelloApi.class);
api.sayHello();
}
总结
- XmlBeanFactory:由BeanFactory实现,提供基本的ioc功能,可以从classpath或文件系统中获取资源。
- ClassPathXmlApplicationContext:AppcationContext实现,从classpath获取配置文件。
- FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件。
ioc容器的工作原理
- 准备配置文件,helloWorld.xml,在配置文件中声明Bean,也就是为Bean配置元数据。
- 由ioc容器进行解析元数据,Ioc容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,Ioc容器根据BeanDefinition进行实例化、配置及组装Bean。
-
实例化ioc容器,由客户端实例化容器,获取需要的Bean。