ioc概念原理就不在细说了,知道java反射的话理解并实现一个简单的Ioc其实很简单,现在很多框架都会用到反射,还有框架中的工厂模式,基本都离不开反射,所以做为一个java程序员掌握反射的基本用法是一个基本的要求。
废话不多说直接上程序,下面程序是实现ioc的核心部分,用到的配置文件还有其它类都在附件中,这个程序仅实现了ioc的依赖注入功能,比较简单主要用到技术有xml解析及反射。
在test包中有单元测试一个是反射的单元测试,一个是依赖注入的单元测试,运行时候需要自己导入junit包。
(这代码其实是在2012年写的,最近给项目组分享ioc原理及实现,又翻出来了,做演示用。:oops: )
package com.factory;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.ioc.bean.Book;
import com.ioc.bean.User;
public class BeanFactory {
private static Map<String, Object> beanMap = new HashMap<String, Object>();
/**
* bean工厂的初始化,并进行属性注入
*
* @param xml
*
*/
@SuppressWarnings("unchecked")
public void init(String xml) {
try {
//从class目录下获取指定的xml文件
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream ins = classLoader.getResourceAsStream(xml);
//解析xml
SAXReader reader = new SAXReader();
Document doc = reader.read(ins);
Element root = doc.getRootElement();
Element beanNode;
//遍历bean
for (Iterator i = root.elementIterator("bean"); i.hasNext();) {
beanNode = (Element) i.next();
// 获取bean的属性id和class
Attribute id = beanNode.attribute("id");
Attribute className = beanNode.attribute("class");
//利用Java反射机制,通过class的名称获取Class对象
Class beanClass = Class.forName(className.getText());
//实例化对象
Object obj = beanClass.newInstance();
//设置对象属性值
setBeanProperty(beanNode,beanClass,obj);
// 将对象放入beanMap中,其中key为id值,value为对象
beanMap.put(id.getText(), obj);
}
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
}
//设置对象属性值
@SuppressWarnings("unchecked")
private static void setBeanProperty(Element beanNode,Class beanClass,Object obj) throws Exception{
// 设置值的方法
Method method = null;
// 获取对应class的信息
java.beans.BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(beanClass);
// 获取其属性描述
java.beans.PropertyDescriptor proDescriptor[] = beanInfo.getPropertyDescriptors();
// 遍历该bean的property属性
for (Iterator ite = beanNode.elementIterator("property"); ite.hasNext();) {
Element beanPro = (Element) ite.next();
// 获取该property的name属性
Attribute name = beanPro.attribute("name");
Attribute ref = beanPro.attribute("ref");
Object proVal = null;
if(ref!=null){
proVal=beanMap.get(ref.getValue());
}else{
// 获取该property的子元素value的值
for (Iterator ite1 = beanPro.elementIterator("value"); ite1.hasNext();) {
Element node = (Element) ite1.next();
proVal = node.getText();
break;
}
}
for (int k = 0; k < proDescriptor.length; k++) {
if (proDescriptor[k].getName().equalsIgnoreCase(name.getText())) {
method = proDescriptor[k].getWriteMethod();
// 利用Java的反射极致调用对象的某个set方法,并将值设置进去
method.invoke(obj, proVal);
}
}
}
}
/**
* * 通过bean的id获取bean的对象. *
*
* @param beanName
* bean的id *
* @return 返回对应对象
*/
public static Object getBean(String beanName) {
Object obj = beanMap.get(beanName);
return obj;
}
static{
BeanFactory factory = new BeanFactory();
factory.init("config.xml");
}
/**
* * 测试方法. *
*/
public static void main(String[] args) {
User userBean = (User) BeanFactory.getBean("userBean");
System.out.println("userName=" + userBean.getUserName());
System.out.println("password=" + userBean.getPassword());
System.out.println("password=" + userBean.getBook().getBookName());
Book bookBean=(Book)BeanFactory.getBean("bookBean");
System.out.println("bookName=" + bookBean.getBookName());
}
}
分享到:
相关推荐
**IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...
在IT行业中,Spring框架是Java开发中的一个关键组件,尤其在企业级应用中,它扮演着核心...这个自己实现的IoC容器可以帮助初学者建立起对依赖注入和控制反转概念的直观认识,并为理解和使用Spring框架打下坚实的基础。
当我们自己动手实现IOC容器时,可以更深入地理解其内部的工作机制。 ### 1. IOC基本原理 **控制反转**的核心思想是将对象的创建和管理权交给容器,而不是由对象自身负责。这样,对象不再需要知道依赖的具体实现,...
实验要求 1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个...然后我们需要自己实现一个IoC容器类,处理自定义的注解的基本逻辑; 接下来在test类中实例化IoC容器,并从中取得bean,调用其方法
《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...
本文将从实现的角度,通过对外部接口、内部实现、组成部分和执行过程四个角度深入剖析Spring IoC容器的结构。 首先,Spring IoC容器的外部接口主要包括`ApplicationContext`和`BeanFactory`。`BeanFactory`是IoC...
本文将深入探讨一个简单的IOC容器实现,帮助我们理解DI的基本原理。 首先,理解IOC的概念至关重要。在传统的编程模式中,对象通常自行创建依赖的对象,这导致了代码之间的紧密耦合。而在IOC模式下,容器负责管理...
通过学习和实践手动实现IOC容器,开发者不仅能更好地理解Spring框架的工作原理,还能提升设计和实现复杂系统的能力。这个过程涉及到了许多核心的Java技术和设计模式,对提升软件工程能力大有裨益。
1. 源代码文件(.java):这些文件可能包含了实现IOC容器的类,如一个用于扫描注解并处理依赖注入的主容器类,以及带有注解的被注入对象类。 2. 注解(Annotations):例如`@Autowired`或自定义注解,用于标记需要...
现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。...
总结,MVC与IOC容器的结合在Formwork框架中实现了高度的模块化和解耦,使得开发者能够更专注于业务逻辑,而不是对象的创建和管理。通过依赖注入,降低了组件间的耦合,增强了代码的可读性和可测试性,为项目的开发和...
在Java开发中,Spring框架是最为著名的实现IOC的库。它改变了传统程序设计中对象间的依赖关系创建方式,将对象的创建和组装交给专门的容器来处理,从而使开发者能更专注于业务逻辑的编写。 **IOC容器的角色** 1. *...
在 Java 社区中,有一些流行的 IoC 容器实现了依赖注入,比如 Spring Framework 和 PicoContainer。这些框架提供了一系列工具和 API 来支持 IoC 和 DI,使开发者能够更加高效地组织和管理项目中的组件。 - **Spring...
在本项目中,我们通过“利用反射自实现IOC容器”来探讨如何构建一个简单的DI框架,以理解其核心概念和工作原理。 首先,我们需要了解什么是DOM4J。DOM4J是一个Java库,用于处理XML文档,它提供了丰富的API,可以...
在实现自定义的Spring IOC容器时,我们需要关注以下几个核心知识点: 1. **Bean的定义与注册**:首先,我们需要创建一个表示Bean的类或接口,包含Bean的ID、类名等信息。Bean的定义可以通过XML配置文件、注解或者...
本篇文章将深入探讨Spring实现原理,阐述IoC容器的优点,并指导如何在Eclipse中创建一个Spring的Web应用。 首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的...
### Spring IoC容器部署实现详解 #### 一、Spring IoC容器概述 Spring框架的核心特性之一就是Inversion of Control(IoC),也被称为Dependency Injection(DI)。IoC容器是Spring框架的重要组成部分,它负责管理...