Spring IOC(控制反转)是Spring框架的核心特性,彻底改变了Java对象管理的方式。传统开发中对象之间的引用需要通过new关键字手动创建,而Spring IOC将对象的创建和依赖管理交给容器统一处理,实现了控制权的反转
Spring IOC的实现用到了设计模式:简单工厂,他也是从简单工厂进化而来的,下面我们看看Spring的IOC是如何进化来的。
一、简单工厂模式
1.1 接口Fruit
1 | |
1.2 实现类Apple和Orange
Apple实现类:
1 | |
- */
1
* @author Howe Hsiang}1
2
3
4
5public class Apple implements Fruit {
java
@Override
public void eat() {
System.out.println("吃苹果");
Orange实现类:
package com.study.service.Impl;
/**
- 实现类Orangepublic class Orange implements Fruit {
1
2*
*/
System.out.println(“吃橘子”);
1 | |
*/
1 | |
}
1 | |
}
1 | |
}
}
1.4 测试类SimpleFactoryTest
import org.junit.Test;
/**
测试简单工厂模式
1
2*
*/public class SimpleFactoryTest extends BaseTest {
@Test
public void getInstance() {
//苹果
Fruit apple = SimpleFactory.getInstance(“apple”);
apple.eat();
//橘子
Fruit orange = SimpleFactory.getInstance(“orange”);
orange.eat();
1 | |
二、反射+简单工厂模式
如果增加了水果,比如香蕉,那么在工厂类里面也要进行相关的修改了,这样不合理,而java的反射机制可以解决这个问题.
2.1 反射工厂类ReflexFactory
/**
- 反射+简单工厂模式
- 反射工厂类
*/
public class ReflexFactory {
try {
f = (Fruit) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2 测试类ReflexFactoryTest
1 | |
三、反射+简单工厂模式+xml配置文件
3.1 实例配置类PropertiesOperate
1 | |
- */
1 | |
}
1 | |
}
1 | |
}
1 | |
}
}
3.2 测试类PropertiesOperateTest
/**
测试反射+简单工厂模式+xml配置文件
1
2*
*/public class PropertiesOperateTest extends BaseTest {
@Test
public void getProperties(){
Properties pro=new PropertiesOperate().getProperties();
//苹果
Fruit apple = ReflexFactory.getInstance(pro.getProperty(“apple”));
//橘子
Fruit orange = ReflexFactory.getInstance(pro.getProperty(“orange”));
1 | |
四、终极版本Spring IOC
以后如果要增加新的水果类,都要在这个配置文件里面登记。这时我们可以说配置文件可以控制程序的执行,现在看起来有点像spring的ioc了。下面我们来看看Spring IOC是如何实现的。
4.1 实体类Person和Grade
实体类Person:
package com.study.entity;
/**
人类
*/
public class Person {private String name;
private int age;
private Grade grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
实体类Grade:
1 | |
<!--下面很多Bean-->
<!--第一个Bean,是一个Person类,id名字随便取,还要写上类的全名-->
<bean id="Person" class="com.study.entity.Person">
<!--同上-->
<bean id="Grade" class="com.study.entity.Grade">
4.3 测试类SpringIocTest
1 | |
五、其他
1、关于Spring读取配置文件的方法
applicationcontext—
FileSystemXmlApplicationContext—这个方法是从文件绝对路径加载配置文
1 | |
XmlWebApplicationContext—-专为web工程定制的方法,推荐Web项目中使用。
beanfactory—
1 | |
FileSystemResource — 从文件系统加载,比如说自己指定配置文件的全路径
InputStreamResource — 从输入流中加载
ServletContextResource — 从Servlet 上下文环境中加载
UrlResource — 从指定的Url加载
2、BeanFactory和ApplicationContext的区别
ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。
ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能:
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层
最主要的就是BeanFactory延迟加载,当使用到getBean的时候才会抛异常,而ApplicationContext在刚开始启动加载的时候就会抛出异常,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext。
1 | |
本文标题: Spring框架核心IOC开发
发布时间: 2019年03月25日 00:00
最后更新: 2026年09月16日 05:40
原始链接: https://haoxiang.eu.org/92e11628/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

