第一篇中介绍了读取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框架的核心组件——控制反转(Inversion of Control,简称IOC)。IOC是一种设计模式,它将对象的创建和管理职责从应用代码中解耦出来,转交给一个外部...
标题中的"autofac+mvc5+三层-ioc"指的是使用Autofac作为依赖注入容器,在ASP.NET MVC5框架下实现三层架构(通常包括表现层、业务逻辑层和数据访问层)的应用程序,并通过IOC(Inversion of Control,控制反转)来...
本书详细介绍了以JSP 2、Struts 2、Spring 2.5、Hibernate 3.2、AJAX等主流JavaEE技术进行优化组合开发高性能大型门户网站的实践经验。针对读者的不同学习阶段,共分技术篇、实践篇与部署篇三大部分进行循序渐进地...
二是“反转”,意味着这个控制权不再由使用接口的类自己决定,而是交给了一个外部容器或框架。这样,代码的耦合度降低,提高了灵活性和可维护性,因为组件之间的依赖关系可以独立地管理和修改,而无需改动相关组件的...
标题 "我的IOC(一)" 暗示了这是一个关于控制反转(Inversion of Control,简称IOC)的系列文章的第一部分。IOC是软件设计模式中的一种,尤其在Java和.NET等面向对象编程语言中广泛使用,它将对象的创建和组装过程...
Spring系列第2篇:控制反转(IoC)与依赖注入(DI)。Spring系列第3篇:Spring容器基本使用及原理。Spring系列第4篇:xml中bean定义详解(-)Spring系列第5篇:创建bean实例这些方式你们都知道?Spring系列第6篇:玩转...
### 2023最新版Java学习路线图-第6阶段大厂面试专题 #### Java学习路线概述 本文档提供了一份详细的2023年Java学习路径,旨在帮助那些希望在IT行业,尤其是大型互联网公司中寻找工作的Java开发者们更好地准备面试...
本篇我们将聚焦于C#实现的IOC(Inversion of Control,控制反转),即DI的一种形式,主要讲解如何自定义实现一个简单的IOC容器。 标题中提到的“C#实现IOC代码”通常指的是开发者为了理解和掌握DI原理,自己编写了...
### 高级软件人才培训专家-day14-SpringBoot原理篇 #### 一、配置优先级 在前几日的学习中,我们已经掌握了如何利用Spring Boot进行Web开发的基础技术,并了解了面向应用层面的开发方法。现在我们将进一步深入探讨...
本篇文档将深入探讨这些核心概念以及相关联的技术。 1. **控制反转(IoC)容器** - **IoC原理**:IoC是一种设计模式,其核心思想是将对象的创建和管理交给外部容器来处理,而不是由对象自身负责。这使得应用程序的...
第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的核心机制和设计理念。Spring作为Java领域最为广泛应用的框架之一,其源码的深入理解对于开发者来说至关重要。这篇...
第2篇 Struts 2篇 第7章 编写Struts 2的第一个程序 第8章 Struts 2进阶 第9章 Struts 2的* 第10章 Struts 2的类型转换 第11章 Struts 2的输入校验 第12章 文件的上传和下载 第13章 国际化 第14章 ...
【教学 - 入门篇】WebWork 2 是一篇针对初学者介绍WebWork框架的教程。WebWork是一个基于Java的Model-View-Controller (MVC) 框架,它提供了一系列强大的特性来帮助开发者构建高效、可维护的Web应用程序。 ### 主要...
在本篇文档的第二部分,我们将深入探讨Spring的核心技术,包括控制反转(IoC)容器、事件处理、资源管理、国际化(i18n)、验证、数据绑定、类型转换、Spring表达式语言(SpEL)以及面向切面编程(AOP)。...
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 ...
本篇保姆级教程将带你深入理解这两个概念,结合源码分析,帮助你快速上手。 **自动配置(Auto-configuration)** 自动配置是Spring Boot的一大亮点,它基于条件注解(Conditional Annotations)来自动配置你的应用...
第二个设计模式:观察者模式 观察者模式是一种常见的设计模式,它是指在对象之间的一种一对多的依赖关系。观察者模式可以用来实现 IOC 模式,在 Java 中,我们可以使用 Observer 接口来实现观察者模式。 例如,...
它的特点是延迟加载,即只有当第一次通过`getBean`方法请求某个Bean时,才会创建该Bean的实例。 - **ApplicationContext**: 它继承自`BeanFactory`,提供了更多的功能和服务。如资源访问、事务管理、消息服务等,...
本篇文章将深入探讨如何在Android环境中自定义实现IoC,包括控件注入、布局注入和事件注入。 首先,我们来理解一下什么是控件注入。在传统的Android开发中,我们通常在Activity或Fragment中手动初始化UI控件,如...