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

自己对spring ioc的理解

 
阅读更多

此时心情:有时候工作的很努力,很认真也会被辞退,被小外包公司请辞,当然也是一个重新认识自己,提高自己的机会

 

我对spring ioc的理解是,1解析xml2利用反射生成类3利用反射构建类之间注入关系

 

1.解析xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	
	<bean id="room" class="com.howto.parseXML.model.Room">
		<property name="person" ref="person" />
	</bean>
	
	<bean id="person" class="com.howto.parseXML.model.Person">
	</bean>
	
</beans>

 

package com.howto.parseXML.util;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ParseXML {
	
	static Logger logger = Logger.getLogger(ParseXML.class.getName());
	
	
	public Map<String, Map<String, Object>> parseIOC(String filename) {
		List parseList = new ArrayList();
		
		SAXReader saxReader = new SAXReader();
		Document document;
		
		Map<String, Map<String, Object>> iocMap = new HashMap<String, Map<String, Object>>();
		try{
			
			InputStream input = this.getClass().getClassLoader().getResourceAsStream(filename); 
			document = saxReader.read(input);
			//document = saxReader.read(new File(filename));
			
			Element root_EL = document.getRootElement();
			
			for(Iterator iter=root_EL.elementIterator();iter.hasNext();) {
				Element bean_EL = (Element)iter.next();
				
				Map<String, Object> tempMap = new HashMap<String, Object>();
				
				tempMap.put("id", bean_EL.attribute("id").getValue());
				tempMap.put("class", bean_EL.attribute("class").getValue());
				List<Map<String, String>> propertyList = new ArrayList<Map<String, String>>();
				for(Iterator iter0=bean_EL.elementIterator();iter0.hasNext();){
					Element property_EL = (Element)iter0.next();
					Map<String, String> propertyMap = new HashMap<String, String>();

					propertyMap.put("name", property_EL.attribute("name").getValue());
					propertyMap.put("ref", property_EL.attribute("ref").getValue());
					
					propertyList.add(propertyMap);
					
				}
				
				tempMap.put("property", propertyList);
				
				iocMap.put(bean_EL.attribute("id").getValue(), tempMap);
			}
		} catch(DocumentException e) {
			e.printStackTrace();
		}
		return iocMap;
	}
	
}

 2and3反射生成类并存入map中,构建注入关系

 

package com.howto.ioc;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.howto.parseXML.util.ParseXML;

public class BeanFactory {
	public static Map<String, Object> beanContainer = new HashMap<String, Object>();
	
	public static void init() {
		//通过 反射 初始化 bean 
		instanceBean();
		
		//构建 bean 依赖关系 
		invokeBean();
		
		System.out.println("init success!");
	}



	public
	static ParseXML parseXML = new ParseXML();
	//解析 xml
	public
	static Map<String, Map<String, Object>> beanXML = parseXML.parseIOC("application.xml");
	
	private static void instanceBean() {
		
		Set<String> beanKeys = beanXML.keySet();
		//初始化 bean
		for(String beanID: beanKeys) {
			
			Map<String, Object> beanDesc = beanXML.get(beanID);
				
			Object bean = getBean(beanID);
			
			beanContainer.put(beanID, bean);
				
			
			
		}
		
	}
	
	private static void invokeBean() {
		Set<String> beanKeys = beanXML.keySet();
		
		for(String beanID: beanKeys) {
			
			Map<String, Object> beanDesc = beanXML.get(beanID);
			
			invoke(beanDesc);
				
		}
	}
	
	private static void invoke(Map<String, Object> beanDesc) {
		
		Class<?> beanClass;
		try {
			beanClass = Class.forName((String)beanDesc.get("class"));

			List<Map<String, Object>> methodList = getBeanSetMethod(beanClass, (List<Map<String, String>>)beanDesc.get("property"));
			
			for(Map<String, Object> tempMap: methodList) {
				Method setMethod = (Method)tempMap.get("method");
				
				Class<?>[] para = (Class<?>[])tempMap.get("para");
				
				String beanID = (String)beanDesc.get("id");
				Object obj = getBean(beanID);
				setMethod.invoke(obj, tempMap.get("ref"));
				System.out.println(obj);
			}
			
			
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} 
		
		
		
	}

	private static List<Map<String, Object>> getBeanSetMethod(Class<?> beanClass, List<Map<String, String>> propertylist)  {
		List<Map<String, Object>> setMethodList = new ArrayList<Map<String, Object>>();
		for(Map<String, String> propertyMap: propertylist) {
			Map<String, Object> tempMap = new HashMap<String, Object>();
			
			Method setProMethod = getSetMethod(beanClass, propertyMap);
			
			Class<?> para[] = setProMethod.getParameterTypes();
			
			tempMap.put("methodName", setProMethod.getName());
			tempMap.put("para", para);
			tempMap.put("method", setProMethod);
			tempMap.put("ref", getBean(propertyMap.get("ref")));
			setMethodList.add(tempMap);
		}
		return setMethodList;
	}
	//拿到 属性set 方法method
	private static Method getSetMethod(Class<?> beanClass,
			Map<String, String> propertyMap) {
		Method[] methods = beanClass.getMethods();
		
		for(Method tempMethod: methods) {
			if(tempMethod.getName().equals(getSetPramMethodName(propertyMap)))
				return tempMethod;
		}
		return null;
	}
	//生成 属性 set 方法名
	private static Object getSetPramMethodName(Map<String, String> propertyMap) {
		String prameterName = propertyMap.get("name");
		String setPramMethodName = "set" + prameterName.substring(0, 1).toUpperCase() + prameterName.substring(1);
		
		return setPramMethodName;
	}

	private static Object getBean(String beanID)  {
		
		if(beanContainer.containsKey(beanID)) {
			return beanContainer.get(beanID);
		} else {
			Map<String, Object> beanDesc = beanXML.get(beanID);
			
			Object obj = null;
			try {
				obj = Class.forName((String)beanDesc.get("class")).newInstance();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			return obj;
		}
		
		
	}
}

 4将其加入到web中,通过servletcontextlistener

package com.howto.ioc;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class IocServletContextListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		BeanFactory.init();
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>ioc_v0.1</display-name>


	<listener>
		<listener-class>com.howto.ioc.IocServletContextListener</listener-class>
	</listener>
	
</web-app>

  

注:其中model类

package com.howto.parseXML.model;

public class Room {
	public String roomName;
	public Person person;
	
	public String getRoomName() {
		return roomName;
	}
	public void setRoomName(String roomName) {
		this.roomName = roomName;
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	
	
}

 

package com.howto.parseXML.model;

public class Person {
	public String personName;
	public String age;
	
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getPersonName() {
		return personName;
	}
	public void setPersonName(String personName) {
		this.personName = personName;
	}
	
	
	
}

 

之前一直认为ioc很神秘,当真正去了解它的时候,才发现,其思想并不复杂,只是spring 源码过于庞大了,无从下手,以菜鸟的心面的世界,不管我写什么,都是在自己的世界重复发明轮子而已。

分享到:
评论

相关推荐

    springIoc实现原理

    **Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中...在实际开发中,理解并熟练运用Spring Ioc,对于提升开发效率和质量具有重要作用。

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和...同时,这样的测试也有助于理解和学习Spring IOC的工作机制,提升对Spring框架的理解。

    Spring IoC加载流程讲解

    Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和...通过了解 Spring IoC 加载流程,我们可以更好地理解 Spring 的核心机制,并更好地使用 Spring 框架进行开发。

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建...通过学习和理解这个项目,你可以深入掌握Spring IOC的核心原理,并将其应用到自己的项目中。

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    Springioc注入Demo

    DI(Dependency Injection,依赖注入)是IOC的一种实现方式,通过配置或编程的方式,将对象之间的依赖关系在运行时动态注入,而不是由对象自己去查找和创建依赖。 在Spring IOC中,主要的注入方式有以下几种: 1. ...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    Spring IOC.pdf

    在Spring框架中,IOC具体体现在对依赖关系的管理上,使得对象的创建、依赖关系的绑定等过程不再由应用程序自身完成,而是转移到一个外部容器(IoC容器)中进行管理,这样就实现了控制权的反转。 首先,Spring IoC...

    谈谈Spring IOC得理解,原理与实现.md

    谈谈Spring IOC得理解,原理与实现.md

    Java反射_Spring IOC

    通过阅读这本书和实践提供的JAVA+Spring示例代码,初学者可以深入理解Java反射的原理和Spring IOC的实际应用,从而提高编程技能,更好地应对复杂的项目需求。在学习过程中,务必理论与实践相结合,加深理解,这样...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    综上所述,文档《Spring IoC源码深度剖析开源架构源码2021.pdf》的知识点聚焦于Spring框架中IoC容器的实现原理,以及如何通过阅读源码来提升对Spring框架乃至整个Java开源生态的理解和应用能力。通过逐步深入到源码...

    springioc的详细讲解

    以下是对Spring IOC容器的详细讲解: 1. **Bean的定义**:在Spring中,我们通过XML、Java配置或者基于注解的方式定义Bean。Bean定义包含了Bean的类、属性、依赖关系等信息。例如,在XML配置文件中,我们可以使用`...

    Spring IOC容器实现分析.pdf 下载

    本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以帮助开发者更好地利用这一强大的工具。 一、IOC容器的概念 IOC,即控制反转,是面向对象编程中的一个设计原则,它的主要思想是将对象的创建和管理权...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一...以上就是关于Spring IoC容器以及注解依赖注入的相关知识点介绍,希望能够帮助大家更好地理解和掌握这一重要的技术。

    以注解方式模拟Spring IoC AOP

    在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...

    模拟spring ioc过程

    这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...

    Spring IOC源码解读

    此外,Spring的IOC容器还支持对集合类型的注入,如List、Map等,以及对工厂方法的调用,允许动态生成Bean实例。在处理复杂依赖关系时,Spring还可以通过自动装配(Auto-Wiring)来简化配置,自动查找并注入匹配的...

    手写spring ioc(三) 资源org.zip

    总的来说,手写Spring IOC是一个深入理解和实践IoC设计模式的好方法,它能帮助开发者更深入地了解Spring框架的工作原理,提高对依赖注入和对象管理的理解。通过这个过程,我们可以更好地掌握如何在实际项目中应用...

Global site tag (gtag.js) - Google Analytics