Spring源码系列-IOC与DI 1.2

IOC容器概念

ioc容器就是具有依赖注入功能的容器,ioc容器负责实例化,定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需在代码中new相关对象,应用程序由ioc容器进行组装。BeanFactory是ioc容器的实际代表者。

ioc容器是如何知道它管理的对象的?

通过读取配置文件的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。

Bean的概念

由Ioc容器管理的那些组成应用程序的对象,在Spring中称之为Bean,Bean由Spring容器初始化,装配及管理。Bean就是普通的java对象。

ioc如何实例如何实例化bean

需要配置元数据,在Spring中用BeanDefinition代表

例子

项目的结构图

Spring源码系列-IOC与DI 1.2_第1张图片
项目结构图.png

创建一个接口

public interface HelloApi {
    public void sayHello();
}

创建一个实现类

  public class HelloImp implements HelloApi {
    @Override
    public void sayHello() {
        System.out.println("hello world");
    }
}
接口和实现类都开发好了,那如何使用ioc容器来管理呢?
  

    

测试

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();
    }

总结

  1. XmlBeanFactory:由BeanFactory实现,提供基本的ioc功能,可以从classpath或文件系统中获取资源。
  2. ClassPathXmlApplicationContext:AppcationContext实现,从classpath获取配置文件。
  3. FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件。

ioc容器的工作原理

  1. 准备配置文件,helloWorld.xml,在配置文件中声明Bean,也就是为Bean配置元数据。
  2. 由ioc容器进行解析元数据,Ioc容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,Ioc容器根据BeanDefinition进行实例化、配置及组装Bean。
  3. 实例化ioc容器,由客户端实例化容器,获取需要的Bean。


    Spring源码系列-IOC与DI 1.2_第2张图片
    ioc容器.jpg

你可能感兴趣的:(Spring源码系列-IOC与DI 1.2)