`
iluoxuan
  • 浏览: 580337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己写IOC-----第二篇

 
阅读更多

第一篇中介绍了读取xml节点,现在就可以按照配置要求生产对象了:个人没怎么重构代码就这样写了

反射操作类:

 

  package com.reflect;

import java.lang.reflect.Method;

public class IOCReflect {
	private static IOCReflect install = null;

	private IOCReflect() {

	}

	public synchronized static IOCReflect getInstall() {

		if (install == null) {
			install = new IOCReflect();
		}
		return install;
	}

	/**
	 *  根据class名生成对象
	 */
	public Object newInstallByClass(String classname) throws Exception {
		return Class.forName(classname).newInstance();
	}

	/**
	 * set注入对象
	 */
	public void setObject(Object bean, Object refOb, String refName)
			throws Exception {
		String refset = refName.substring(0, 1).toUpperCase()
				+ refName.substring(1);

		String pName = "set" + refset;
		System.out.println("refset---" + refset + "---bean---"
				+ bean.toString() + "  pname--" + pName);
		Method method = bean.getClass().getMethod(pName, refOb.getClass());
		System.out
				.println("method---" + method.getName() + "--refob--" + refOb);
		if (method != null) {

			method.invoke(bean, refOb);
			System.out.println("注入成功");
		} else {
			System.out.println("注入失败");
		}
	}
}

 

上面基本实现了set注入功能

下面看 IOC操作类

 

package com.ioc;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import org.jdom2.Element;

import com.jdom.xml.IOCdomXml;
import com.reflect.IOCReflect;

/**
 * set 注入功能
 * @author lijunqing
 *
 */
public class IOC1 {
	private Map<String, Object> beanOb = null;

	public IOC1(String xmlPath) throws Exception {
		beanOb = objectBean(xmlPath);
		setObjectByRef(xmlPath);
	}

	/**
	 * 读取xml文件,保存生成相应bean的对象
	 * @throws Exception 
	 */
	public Map<String, Object> objectBean(String xmlPath) throws Exception {

		String beanID = null;
		Map<String, Object> obMap = new HashMap<String, Object>();
		Map<String, Element> beanMap = new HashMap<String, Element>();
		beanMap = IOCdomXml.getInstall().getBeanElement(xmlPath);
		for (Map.Entry<String, Element> beanEntry : beanMap.entrySet()) {
			beanID = beanEntry.getKey();
			String beanName = beanEntry.getValue().getAttributeValue("class");
			//根据 beanName生成对象
			System.out.println("beanName----" + beanName + "---beanID--"
					+ beanID);
			Object beanOb = IOCReflect.getInstall().newInstallByClass(beanName);
			obMap.put(beanID, beanOb);
		}
		return obMap;
	}

	/*
	 * set注入对象
	 */
	public void setObjectByRef(String xmlPath) throws Exception {
		Map<String, Object> obMap = objectBean(xmlPath);
		Map<String, Element> refBeanMap = null;
		Object bean = null;
		Map<String, Map<String, Element>> refMap = IOCdomXml.getInstall()
				.getRefBeanElements(xmlPath);
		for (Map.Entry<String, Map<String, Element>> entry : refMap.entrySet()) {
			String beanID = entry.getKey();
			bean = obMap.get(beanID);
			refBeanMap = entry.getValue();
			for (Map.Entry<String, Element> refBean : refBeanMap.entrySet()) {
				String refName = refBean.getKey();
				String refBeanID = refBean.getValue().getAttributeValue("ref");
				//判断bean对象中是否用set加上这个refName的set方法
				System.out.println("refName--" + refName + "     refBeanID--"
						+ refBeanID);
				//拿出refBeanID对象
				Object refOb = obMap.get(refBeanID);
				if (refOb != null) {
					//		    		    	    //判断有没有set方法,调用bean对象的Method方法插入对象
					//		    		    	     Method beanMethod = bean.getClass().getMethod("set"+refName);
					//		    		    	     if(beanMethod != null){
					//		    		    	    	    beanMethod.invoke(bean, refOb);
					//		    		    	     }
					IOCReflect.getInstall().setObject(bean, refOb, refName);
				}

			}
		}
	}

	public Object getBean(String beanID) {
		return beanOb.get(beanID);
	}
}
 

下面是测试类

 

package com.test;

import org.junit.Test;

import com.domain.Person;
import com.ioc.IOC1;
import com.servce.LoginServce;

public class TestIOC {
      @Test
      public void TestgetBean() throws Exception{
    	    IOC1 ioc = new IOC1("beans.xml");
    	    LoginServce login =(LoginServce)ioc.getBean("loginServce");   
    	    login.getPersonInfo();
    	    Person p = (Person) ioc.getBean("person");
    	    if(login.getPerson() != null){
    	    	   System.out.println("pname----"+login+"person--"+p);
    	    }
    	    
    	    
      }
}

 

测试结果如下:

beanName----com.domain.Person---beanID--person
beanName----com.servce.LoginServce---beanID--loginServce
beanName----com.domain.Person---beanID--person
beanName----com.servce.LoginServce---beanID--loginServce
propety------- prooety
refName--person     refBeanID--person
refset---Person---bean---com.servce.LoginServce@f4f44a  pname--setPerson
method---setPerson--refob--<name>ljq</name><age>13</age>
注入成功
pname----com.servce.LoginServce@1d256faperson--<name>ljq</name><age>13</age>
 
分享到:
评论

相关推荐

    【框架源码篇 01】Spring源码-手写IOC

    在本系列的第一篇【框架源码篇 01】中,我们将深入探讨Spring框架的核心组件——控制反转(Inversion of Control,简称IOC)。IOC是一种设计模式,它将对象的创建和管理职责从应用代码中解耦出来,转交给一个外部...

    autofac+mvc5+三层-ioc

    标题中的"autofac+mvc5+三层-ioc"指的是使用Autofac作为依赖注入容器,在ASP.NET MVC5框架下实现三层架构(通常包括表现层、业务逻辑层和数据访问层)的应用程序,并通过IOC(Inversion of Control,控制反转)来...

    第6章 充分利用Spring2的IOC利器统管Bean世界----大型门户网站是这样炼成的

    本书详细介绍了以JSP 2、Struts 2、Spring 2.5、Hibernate 3.2、AJAX等主流JavaEE技术进行优化组合开发高性能大型门户网站的实践经验。针对读者的不同学习阶段,共分技术篇、实践篇与部署篇三大部分进行循序渐进地...

    透透彻彻IoC(你没有理由不懂!) - stamen的程序员之路 - ITeye技术网站1

    二是“反转”,意味着这个控制权不再由使用接口的类自己决定,而是交给了一个外部容器或框架。这样,代码的耦合度降低,提高了灵活性和可维护性,因为组件之间的依赖关系可以独立地管理和修改,而无需改动相关组件的...

    我的IOC(一)

    标题 "我的IOC(一)" 暗示了这是一个关于控制反转(Inversion of Control,简称IOC)的系列文章的第一部分。IOC是软件设计模式中的一种,尤其在Java和.NET等面向对象编程语言中广泛使用,它将对象的创建和组装过程...

    JAVA spring 系列案例50个和学习资料

    Spring系列第2篇:控制反转(IoC)与依赖注入(DI)。Spring系列第3篇:Spring容器基本使用及原理。Spring系列第4篇:xml中bean定义详解(-)Spring系列第5篇:创建bean实例这些方式你们都知道?Spring系列第6篇:玩转...

    2023最新版Java学习路线图-第6阶段大厂面试专题

    ### 2023最新版Java学习路线图-第6阶段大厂面试专题 #### Java学习路线概述 本文档提供了一份详细的2023年Java学习路径,旨在帮助那些希望在IT行业,尤其是大型互联网公司中寻找工作的Java开发者们更好地准备面试...

    C#实现IOC代码,供学习用

    本篇我们将聚焦于C#实现的IOC(Inversion of Control,控制反转),即DI的一种形式,主要讲解如何自定义实现一个简单的IOC容器。 标题中提到的“C#实现IOC代码”通常指的是开发者为了理解和掌握DI原理,自己编写了...

    高级软件人才培训专家-day14-SpringBoot原理篇

    ### 高级软件人才培训专家-day14-SpringBoot原理篇 #### 一、配置优先级 在前几日的学习中,我们已经掌握了如何利用Spring Boot进行Web开发的基础技术,并了解了面向应用层面的开发方法。现在我们将进一步深入探讨...

    Spring框架文档 - 核心技术部分 中文版 - 第一部分.pdf

    本篇文档将深入探讨这些核心概念以及相关联的技术。 1. **控制反转(IoC)容器** - **IoC原理**:IoC是一种设计模式,其核心思想是将对象的创建和管理交给外部容器来处理,而不是由对象自身负责。这使得应用程序的...

    java web技术开发大全(最全最新)

    第2篇 Struts 2篇 第7章 编写Struts 2的第一个程序 第8章 Struts 2进阶 第9章 Struts 2的* 第10章 Struts 2的类型转换 第11章 Struts 2的输入校验 第12章 文件的上传和下载 第13章 国际化 第14章 Struts 2的...

    Spring5 源码分析(第 2 版)-某Tom老师

    《Spring5 源码分析(第 2 版)》是某Tom老师精心编写的深度解析文档,旨在帮助读者全面理解Spring5的核心机制和设计理念。Spring作为Java领域最为广泛应用的框架之一,其源码的深入理解对于开发者来说至关重要。这篇...

    java web开发技术大全

    第2篇 Struts 2篇 第7章 编写Struts 2的第一个程序 第8章 Struts 2进阶 第9章 Struts 2的* 第10章 Struts 2的类型转换 第11章 Struts 2的输入校验 第12章 文件的上传和下载 第13章 国际化 第14章 ...

    [教學 - 入門篇] WebWork 2

    【教学 - 入门篇】WebWork 2 是一篇针对初学者介绍WebWork框架的教程。WebWork是一个基于Java的Model-View-Controller (MVC) 框架,它提供了一系列强大的特性来帮助开发者构建高效、可维护的Web应用程序。 ### 主要...

    Spring框架文档 - 核心技术部分 中文版 - 第二部分.pdf

    在本篇文档的第二部分,我们将深入探讨Spring的核心技术,包括控制反转(IoC)容器、事件处理、资源管理、国际化(i18n)、验证、数据绑定、类型转换、Spring表达式语言(SpEL)以及面向切面编程(AOP)。...

    Struts2 chm文档

    2.truts 2权威指南——第2章 Struts 2下的HelloWorld.doc 3.Struts 2权威指南——第3章 Struts 2基础.doc 4.Struts2.0系列(1-15) 5.Struts2中用Spring实现IoC.doc 6.Struts2中的零配置与CoC(Convention over ...

    springboot 3.0.2 自动配置(auto-configuration) 启动器(starter)保姆级教程带源码

    本篇保姆级教程将带你深入理解这两个概念,结合源码分析,帮助你快速上手。 **自动配置(Auto-configuration)** 自动配置是Spring Boot的一大亮点,它基于条件注解(Conditional Annotations)来自动配置你的应用...

    Java使用IOC控制反转的三种设计模式详解

    第二个设计模式:观察者模式 观察者模式是一种常见的设计模式,它是指在对象之间的一种一对多的依赖关系。观察者模式可以用来实现 IOC 模式,在 Java 中,我们可以使用 Observer 接口来实现观察者模式。 例如,...

    Spring高级篇二.pdf

    它的特点是延迟加载,即只有当第一次通过`getBean`方法请求某个Bean时,才会创建该Bean的实例。 - **ApplicationContext**: 它继承自`BeanFactory`,提供了更多的功能和服务。如资源访问、事务管理、消息服务等,...

    Android中自定义实现IoC(控件注入、布局注入、事件注入)

    本篇文章将深入探讨如何在Android环境中自定义实现IoC,包括控件注入、布局注入和事件注入。 首先,我们来理解一下什么是控件注入。在传统的Android开发中,我们通常在Activity或Fragment中手动初始化UI控件,如...

Global site tag (gtag.js) - Google Analytics