天天看點

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,不需要修改代碼,隻需要新增類,然後再在配置檔案中配置一下。

繼續閱讀