一、前言
IOC (Inverse of control) - 控制反转,spring的IOC实现原理为利用Java的反射机制并充当工厂的角色完成对象的装配和注入。
二、实现细节
附上一张类的结构图,该例子需要导入jdom.jar和junit.jar
① 用户Bean
package com.zdp.model;
// 用户类
public class User {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
② UserService
package com.zdp.service;
import com.zdp.dao.UserDao;
import com.zdp.model.User;
public class UserService {
private UserDao userDao;
public void add(User user) {
userDao.save(user);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
③ UserDao
package com.zdp.dao;
import com.zdp.model.User;
public class UserDao {
public void save(User user) {
System.out.println("user saved!");
}
}
④ Bean工厂接口
package com.zdp.spring;
// Bean工厂接口
public interface BeanFactory {
public Object getBean(String id);
}
⑤ Bean工厂实现
package com.zdp.spring;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
// Bean工厂实现类
public class ClassPathXmlApplicationContext implements BeanFactory {
private Map<String, Object> beans = new HashMap<String, Object>();
public ClassPathXmlApplicationContext() throws Exception {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象
Element root = doc.getRootElement(); // 获取根元素HD
List list = root.getChildren("bean"); // 取名字为bean的所有元素
for (int i = 0; i < list.size(); i++) {
Element element = (Element) list.get(i);
String id = element.getAttributeValue("id");
String clazz = element.getAttributeValue("class");
Object beanObj = Class.forName(clazz).newInstance(); // 反射获取对象
beans.put(id, beanObj); // 将对象存入Bean工厂
for (Element propertyElement : (List<Element>) element.getChildren("property")) {
String name = propertyElement.getAttributeValue("name"); // name="userDao"
String bean = propertyElement.getAttributeValue("bean"); // bean="userDao"
Object injectObject = beans.get(bean); // 从Bean工厂中获取UserDao
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); // setUserDao
Method method = beanObj.getClass().getMethod(methodName, injectObject.getClass());
method.invoke(beanObj, injectObject); // set注入UserDao对象
}
}
}
public Object getBean(String id) {
return beans.get(id);
}
}
这里为核心代码,当然在实际情况中,这一块要复杂的多, 例如:可以一个bean引用另一个bean,还可以有多个配置文件、通过多种方式载入配置文件等等,不过原理还是采用Java的反射机制。
⑥ 配置文件
<beans>
<bean id="userDao" class="com.zdp.dao.UserDao" />
<bean id="userService" class="com.zdp.service.UserService" >
<property name="userDao" bean="userDao" />
</bean>
</beans>
⑦ 单元测试
package com.zdp.service;
import org.junit.Test;
import com.zdp.model.User;
import com.zdp.spring.BeanFactory;
import com.zdp.spring.ClassPathXmlApplicationContext;
// 测试代码
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
BeanFactory applicationContext = new ClassPathXmlApplicationContext(); // 获取上下文
UserService service = (UserService) applicationContext.getBean("userService"); // Spring装配Bean
User user = new User();
user.setUserName("zhangsan");
user.setPassword("123456");
service.add(user); // 将user保存入库
}
}
三、小结
上文仅仅是简单地模拟了spring的IOC的实现,虽然只是完成了spring中依赖注入的一小部分,但还是很好地展现了Java反射机制在spring中的应用,对于初学者理解IOC应该会有一点帮助。
源码下载地址:http://download.csdn.net/detail/zdp072/7284983
分享到:
相关推荐
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
/*模拟spring的实现 * 1.通过构造器获取配置文件 * 2.通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)...
这是个模拟spring ioc的学习例子,是个java工程。有助于对aop和ioc的理解
Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>(); 2、本工程,模拟实现Spring的IOC,将xml中配置的Bean读入到Spring容器中,并在测试用例中调用Spring容器中的bean。 3、开发...
NULL 博文链接:https://lgd-java2eye.iteye.com/blog/759878
简单模拟spring ioc技术,一个小demo,希望对您理解ioc有所帮助.
手写springIOC 通过jdom读取xml文件 适合新手使用。
(13) spring-mock.jar 这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,这样测试就更加简单。模拟 HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便...
自己写了一个Spring IoC的模拟,有详细注释,可供刚入门学习spring的童鞋加深理解.
这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,这样测试就更加简单。模拟HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便的。 如何选择这些...
SpringIOC和AOP实现机制模拟,来自与网络。
模拟spring框架的ioc功能,简单实用的实现,高效。
经过我整理了,写好了详细的注释,开发环境是myeclipse,希望对spring初学者能有帮助,大家相互帮助,谢谢!
基于xml注册,简单模拟spring ioc容器。快速理解ioc容器
基于java简单模拟实现spring_ioc
练习共三部分: 1、XML读取,用于配置文件读取 2、模拟SPRING IOC 3、模拟STRUTS
自己实现的简易的模拟Spring的IoC容器,实现注解自动装配
Spring IOC AOP MVC 简单例子
NULL 博文链接:https://justsee.iteye.com/blog/1298861
这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,这样测试就更加简单。模拟HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便的。