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的原理,必选要知道简单工厂方法
下面介绍简单工厂方法
简单工厂模式是一种创建模式,创建模式是帮助我们更好地组织创建对象的代码,适应不同情况下的创建和初始化对象。
简单工厂方法的结构
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICO5MDO1IDM3EzMwkDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
举例
以上面的为例:
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,不需要修改代码,只需要新增类,然后再在配置文件中配置一下。