`
xudongcsharp
  • 浏览: 477254 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

模拟Spring控制反转、依赖注入(包注解)

 
阅读更多
package com.spring.test;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;


public class MySpring {

	List<BeanDefinition> beanDefines=new ArrayList<BeanDefinition>();
	Map<String, Object> map=new HashMap<String, Object>();
	
	public MySpring(String filename){
		//读取XML文件,遍历bean,存放到List
		readXML(filename);
		//遍历bean集合,利用反射实例化bean,存放到Map
		instanceBean();
		//依赖注入
		injectObject();
		//注解注入
		annotationInject();
	}

	private void annotationInject() {
		for(String name : map.keySet()){
			Object bean=map.get(name);
			if(bean!=null){
				try {
					PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
					for(PropertyDescriptor propertyDescriptor : ps){
						Method setter=propertyDescriptor.getWriteMethod();//获取setter方法
						
						//判断注解是否存在
						if(setter!=null && setter.isAnnotationPresent(MyResource.class)){
							MyResource myResource=setter.getAnnotation(MyResource.class);
							Object value=null;
							//声明name属性
							if(myResource.name()!=null && !"".equals(myResource.name())){
								value=map.get(myResource.name());
							}else{
								value=map.get(propertyDescriptor.getName());
								if(value==null){
									for(String key : map.keySet()){
										if(propertyDescriptor.getPropertyType().isAssignableFrom(map.get(key).getClass())){
											value=map.get(key);
											break;
										}
									}
								}
							}
							setter.setAccessible(true);
							setter.invoke(bean, value);//把引用对象注入到属性中
						}
					}
					//字段
					Field[] fields=bean.getClass().getFields();
					for(Field field : fields){
						if(field.isAnnotationPresent(MyResource.class)){
							MyResource myResource=field.getAnnotation(MyResource.class);
							Object value=null;
							//声明name属性
							if(myResource.name()!=null && !"".equals(myResource.name())){
								value=map.get(myResource.name());
							}else{
								value=map.get(field.getName());
								if(value==null){
									for(String key : map.keySet()){
										if(field.getType().isAssignableFrom(map.get(key).getClass())){
											value=map.get(key);
											break;
										}
									}
								}
							}
							field.setAccessible(true);
							field.set(bean,value);
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void injectObject() {
		//循环所有的bean节点
		for(BeanDefinition beanDefinition : beanDefines){
			Object bean= map.get(beanDefinition.getId());
			if(bean!=null){
				
				try {
					PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
					//循环所有的property节点
					for(PropertyDefinition propertyDefinition : beanDefinition.getProperties()){
						for(PropertyDescriptor propertyDescriptor : ps){
							if(propertyDefinition.getName().equals(propertyDescriptor.getName())){
								Method setter=propertyDescriptor.getWriteMethod();//获取setter方法
								if(setter!=null){
									Object value=map.get(propertyDefinition.getRef());
									//如果private,设置允许访问
									setter.setAccessible(true);
									setter.invoke(bean, value);//把引用对象注入到属性中
								}
								break;
							}
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	@SuppressWarnings("unchecked")
	private void readXML(String filename) {
		SAXReader saxReader = new SAXReader();   
        Document document=null;   
        try{
         URL xmlpath = this.getClass().getClassLoader().getResource(filename);
         document = saxReader.read(xmlpath);
         Map<String,String> nsMap = new HashMap<String,String>();
         nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间
         XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径
         xsub.setNamespaceURIs(nsMap);//设置命名空间
         List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点 
         
         for(Element element : beans){
            String id = element.attributeValue("id");//获取id属性值
            String clazz = element.attributeValue("class"); //获取class属性值        
            BeanDefinition beanDefine = new BeanDefinition(id, clazz);
            
            XPath propertysub = element.createXPath("ns:property");//创建beans/property查询路径
            propertysub.setNamespaceURIs(nsMap);//设置命名空间
            List<Element> propertys = propertysub.selectNodes(element);//获取文档下所有property节点 
            for(Element property : propertys){
            	String propertyName=property.attributeValue("name");
            	String propertyRef=property.attributeValue("ref");
            	System.out.println(propertyName+propertyRef);
            	PropertyDefinition pd=new PropertyDefinition(propertyName,propertyRef);
            	beanDefine.getProperties().add(pd);
            }
            
            beanDefines.add(beanDefine);
         }   
        }catch(Exception e){   
            e.printStackTrace();
        }
	}
	
	private void instanceBean() {
		for(BeanDefinition bean : beanDefines){
			try {
				if(bean.getClassName()!=null && !"".equals(bean.getClassName()))
					//实例化Bean对象
					map.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public Object getBean(String id){
		return this.map.get(id);
	}
}
分享到:
评论

相关推荐

    使用反射和注解模拟Spring的依赖注入

    在Java编程中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现...

    自己的代码模拟spring的依赖注入

    在IT行业中,Spring框架是Java开发中的一个基石,尤其在控制反转(IoC)和依赖注入(DI)方面。依赖注入是一种设计模式,它允许我们解耦组件,提高代码的可测试性和可维护性。Spring框架通过IoC容器来实现DI,让我们...

    模拟spring依赖注入

    模拟Spring的依赖注入,旨在理解其核心机制,让我们一起深入探讨这一主题。 首先,我们要明白什么是依赖注入。在传统的编程中,一个对象通常会直接创建或查找它所依赖的对象,这会导致类之间的紧密耦合。依赖注入则...

    以注解方式模拟Spring IoC AOP

    依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合度降低。在Spring中,通常通过以下三种注解实现IoC: - `@Autowired`:自动装配,Spring会根据类型或名称找到...

    模拟Spring的IoC容器实现注解自动装配

    IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试和可维护。而注解自动装配(Autowired)是Spring IoC容器的一种高级特性,它允许我们通过注解来声明对象之间...

    模拟Spring的IOC

    在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC机制对于深入学习Spring...

    IOC控制反转&DI依赖注入

    在软件开发领域,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,特别是在Java和Spring框架中被广泛使用。这些概念有助于提高代码的可测试性、可维护性和模块...

    实例讲解Java的Spring框架中的控制反转和依赖注入

    在Java的Spring框架中,控制反转(IoC,Inversion of Control)和依赖注入(DI,Dependency Injection)是核心设计理念,它们旨在降低组件之间的耦合度,提高代码的可测试性和可维护性。Spring框架通过IoC容器来管理...

    Spring中使用Ioc控制反转

    ### Spring框架中的IoC控制反转详解 #### 一、IoC概述 控制反转(Inversion of Control,简称IoC)是一种设计思想,在Spring框架中,它主要用来解决对象依赖问题。传统的面向对象编程中,对象之间的依赖关系由对象...

    Spring简单模拟Spring容器

    标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...

    模拟Spring IoC

    Spring IoC,全称Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,通过将对象的创建和管理交由容器处理,使得开发人员可以专注于业务逻辑,而不是对象间的依赖关系。在Spring框架...

    Spring依赖注入原理解析.doc

    Spring依赖注入机制,也被称为控制反转(Inversion of Control,IOC),是Spring框架的核心特性,它使得应用程序的组件之间能够实现松散耦合。在传统编程中,对象通常自行创建和管理它们所依赖的其他对象,而在...

    java 解析xml,模拟spring框架ioc

    本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...

    模拟spring ioc过程

    在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理职责从应用代码中分离出来,交由框架来处理。这样,开发者可以更专注于业务逻辑,而不是对象的生命周期。AOP(Aspect ...

    Spring中依赖注入与容器

    在Spring框架中,依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)是核心概念,它们旨在简化组件之间的耦合,提高代码的可测试性和可维护性。IoC指的是应用程序的控制权由原本...

    利用spring实现打印机

    在IT行业中,Spring框架是Java开发领域中广泛使用的轻量级框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)特性而闻名。本教程将深入探讨如何利用...

    spring4.0完整jar包

    1. **Spring Core**:这是Spring框架的基础,提供了IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)的核心实现。IoC通过容器管理对象的生命周期和依赖关系,而DI允许我们解耦代码,使...

    基于框架的Web开发-IoC(控制反转)和DI(依赖注入)入门.doc

    【控制反转(IoC)与依赖注入(DI)】是现代Web开发中,尤其是Spring框架中的核心概念。IoC和DI的主要目标是降低组件之间的耦合性,提高代码的灵活性和可维护性。 传统Java开发中,对象通常自行管理它们的依赖关系...

    spring IOC实现(墨者革离)

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交给了Spring容器,从而让开发者从繁琐的依赖管理中解脱出来,更专注于业务逻辑的实现。在这个名为"spring_IOC实现...

    模拟springIOC

    总结来说,模拟Spring IOC是一个实践性的学习过程,它可以帮助我们深入理解控制反转和依赖注入的概念。通过自己动手实现,我们可以更好地掌握Spring框架的核心机制,这对于任何想要在Java企业级开发中使用Spring的人...

Global site tag (gtag.js) - Google Analytics