天天看点

spring ioc原理分析spring ioc原理分析

spring ioc原理分析

  • spring ioc 的概念
  • 简单工厂方法
  • spirng ioc实现原理

spring ioc的概念

ioc: 控制反转 将对象的创建由spring管理。比如,我们以前用new一个对象的方式自己创建一个对象,现在使用spring,不必自己new一个对象了,而是使用了另一种方式。

spring ioc 入门

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 id="helloService" class="demo1.HelloServiceImpl"></bean>
</beans>
           

HelloService.java

public interface HelloService {
    void sayHello();
}
           

HelloServiceImpl.java

public class HelloServiceImpl implements HelloService {
    private String info;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public void sayHello() {
        System.out.println("hello--" + info);
    }
}
           

使用spring创建对象

@Test
    // Spring开发
    public void demo2() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloService helloService = (HelloService)applicationContext.getBean("helloService");
        helloService.sayHello();
    }
           

简单工厂方法

要想理解spring ioc的原理,必选要知道简单工厂方法

下面介绍简单工厂方法

​简单工厂模式是一种创建模式,创建模式是帮助我们更好地组织创建对象的代码,适应不同情况下的创建和初始化对象。

简单工厂方法的结构

spring ioc原理分析spring ioc原理分析

举例

以上面的为例:

HelloService为抽象产品

HelloServiceImpl为具体产品

我们再写一个具体产品:

HelloServiceImpl2

public class HelloServiceImpl2 implements HelloService {
     public void sayHello() {
        System.out.println("hello-- HelloServiceImpl2");
    }
}
           

对于HelloService,我们以前的客户端调用是这样的:

@Test
    // 传统方式
    public void demo1() {
        // 造成程序紧密耦合.
        HelloService helloService = new HelloServiceImpl();
        helloService.sayHello();
        HelloService helloService2 = new HelloServiceImpl();
        helloService2.sayHello();
    }
           

我们是用new的方式创建一个对象,那如何用工厂方法创建对象?

首先,我们得有一个创建Bean的工厂类

BeanFactory //简单工厂

public class BeanFactory{
    public Object getHelloService(String beanName){
        if(beanName.equals("HelloService1")){
           return new HelloServiceImpl();
        } else if (beanName.equals("HelloService2")){
           return new HelloServiceImpl2();
        } else {
           return null;
        }
    }
}
           

这样,我们以后想获得HelloService就可以这样:

// 客户端调用

BeanFactory beanFactory = new BeanFactory();
HelloService helloService = (HelloService)beanFactory.getHelloService("HelloService1");
           

spirng ioc实现原理

spring ioc的实现原理,实际上就是简单工厂+sax解析xml+反射获取类对象

对于BeanFactory中,我们如下做:

public class BeanFactory{
    public Object getBean(String beanName){
        // 反射 + 解析配置文件
        return Class.forName("类名").new Instance();
    }
}
           

通过id,我们通过解析spring配置文件解析到id所对应的类,然后获取全名,通过反射创建类。这样,我们想获得bean,不需要修改代码,只需要新增类,然后再在配置文件中配置一下。

继续阅读