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的原理,必選要知道簡單工廠方法
下面介紹簡單工廠方法
簡單工廠模式是一種建立模式,建立模式是幫助我們更好地組織建立對象的代碼,适應不同情況下的建立和初始化對象。
簡單工廠方法的結構
舉例
以上面的為例:
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,不需要修改代碼,隻需要新增類,然後再在配置檔案中配置一下。