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);
}
}
分享到:
相关推荐
在Java编程中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现...
在IT行业中,Spring框架是Java开发中的一个基石,尤其在控制反转(IoC)和依赖注入(DI)方面。依赖注入是一种设计模式,它允许我们解耦组件,提高代码的可测试性和可维护性。Spring框架通过IoC容器来实现DI,让我们...
模拟Spring的依赖注入,旨在理解其核心机制,让我们一起深入探讨这一主题。 首先,我们要明白什么是依赖注入。在传统的编程中,一个对象通常会直接创建或查找它所依赖的对象,这会导致类之间的紧密耦合。依赖注入则...
依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合度降低。在Spring中,通常通过以下三种注解实现IoC: - `@Autowired`:自动装配,Spring会根据类型或名称找到...
IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试和可维护。而注解自动装配(Autowired)是Spring IoC容器的一种高级特性,它允许我们通过注解来声明对象之间...
在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC机制对于深入学习Spring...
在软件开发领域,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,特别是在Java和Spring框架中被广泛使用。这些概念有助于提高代码的可测试性、可维护性和模块...
在Java的Spring框架中,控制反转(IoC,Inversion of Control)和依赖注入(DI,Dependency Injection)是核心设计理念,它们旨在降低组件之间的耦合度,提高代码的可测试性和可维护性。Spring框架通过IoC容器来管理...
### Spring框架中的IoC控制反转详解 #### 一、IoC概述 控制反转(Inversion of Control,简称IoC)是一种设计思想,在Spring框架中,它主要用来解决对象依赖问题。传统的面向对象编程中,对象之间的依赖关系由对象...
标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...
Spring IoC,全称Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,通过将对象的创建和管理交由容器处理,使得开发人员可以专注于业务逻辑,而不是对象间的依赖关系。在Spring框架...
Spring依赖注入机制,也被称为控制反转(Inversion of Control,IOC),是Spring框架的核心特性,它使得应用程序的组件之间能够实现松散耦合。在传统编程中,对象通常自行创建和管理它们所依赖的其他对象,而在...
本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...
在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理职责从应用代码中分离出来,交由框架来处理。这样,开发者可以更专注于业务逻辑,而不是对象的生命周期。AOP(Aspect ...
在Spring框架中,依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)是核心概念,它们旨在简化组件之间的耦合,提高代码的可测试性和可维护性。IoC指的是应用程序的控制权由原本...
在IT行业中,Spring框架是Java开发领域中广泛使用的轻量级框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)特性而闻名。本教程将深入探讨如何利用...
1. **Spring Core**:这是Spring框架的基础,提供了IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)的核心实现。IoC通过容器管理对象的生命周期和依赖关系,而DI允许我们解耦代码,使...
【控制反转(IoC)与依赖注入(DI)】是现代Web开发中,尤其是Spring框架中的核心概念。IoC和DI的主要目标是降低组件之间的耦合性,提高代码的灵活性和可维护性。 传统Java开发中,对象通常自行管理它们的依赖关系...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交给了Spring容器,从而让开发者从繁琐的依赖管理中解脱出来,更专注于业务逻辑的实现。在这个名为"spring_IOC实现...
总结来说,模拟Spring IOC是一个实践性的学习过程,它可以帮助我们深入理解控制反转和依赖注入的概念。通过自己动手实现,我们可以更好地掌握Spring框架的核心机制,这对于任何想要在Java企业级开发中使用Spring的人...