- 浏览: 3466040 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="personDao" class="junit.test12.PersonDaoBean"/> <bean id="personService" class="junit.test12.PersonServiceBean"> <property name="id" value="24"/> <property name="name" value="zyj"/> <!-- <property name="personDao" ref="personDao"/> --> </bean> </beans>
package junit.test12; import java.util.ArrayList; import java.util.List; /** * xml中的<bean/>的定义 * @author Administrator * */ public class BeanDefinition { private String id; private String clazz; private List<PropertyDefinition> propertyDefinitions=new ArrayList<PropertyDefinition>(); public BeanDefinition(String id, String clazz) { super(); this.id = id; this.clazz = clazz; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClazz() { return clazz; } public void setClazz(String clazz) { this.clazz = clazz; } public List<PropertyDefinition> getPropertyDefinitions() { return propertyDefinitions; } public void setPropertyDefinitions(List<PropertyDefinition> propertyDefinitions) { this.propertyDefinitions = propertyDefinitions; } }
package junit.test12; public class PropertyDefinition { private String name; private String ref; private String value; public PropertyDefinition(String name, String ref,String value) { super(); this.name = name; this.ref = ref; this.value=value; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRef() { return ref; } public void setRef(String ref) { this.ref = ref; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
package junit.test12; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.METHOD}) public @interface UserDefinedResource { public String name() default ""; }
//使用dom4j读取spring配置文件
package junit.test12; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; 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 junit.test12.BeanDefinition; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; /** * 自定义容器 * @author Administrator * */ public class UserDefinedClassPathXMLApplicationContext { private List<BeanDefinition> beanDefinitions=new ArrayList<BeanDefinition>(); private Map<String, Object> sigletons=new HashMap<String, Object>(); public UserDefinedClassPathXMLApplicationContext(String filename){ this.readXML(filename); this.instanceBeans(); this.annotationInject(); this.injectObject(); } /** * 读取xml配置文件 * @param filename */ private void readXML(String filename){ SAXReader saxReader=new SAXReader(); Document document=null; try { URL xmlPath=this.getClass().getClassLoader().getResource(filename); document=saxReader.read(xmlPath); XPath xPath=document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径。从根路径开始 Map<String, String> nsMap=new HashMap<String, String>(); nsMap.put("ns", "http://www.springframework.org/schema/beans");//加入命名空间 xPath.setNamespaceURIs(nsMap);//设置命名空间 List<Element> beans=xPath.selectNodes(document);//获取文档下所有bean节点 for (Element element : beans) { String id=element.attributeValue("id"); String clazz=element.attributeValue("class"); BeanDefinition beanDefinition=new BeanDefinition(id, clazz); XPath xPath2=element.createXPath("ns:property");//从相对路径开始 xPath2.setNamespaceURIs(nsMap); List<Element> propertys=xPath2.selectNodes(element); for (Element element2 : propertys) { String name=element2.attributeValue("name"); String ref=element2.attributeValue("ref"); String value=element2.attributeValue("value"); PropertyDefinition propertyDefinition=new PropertyDefinition(name, ref,value); beanDefinition.getPropertyDefinitions().add(propertyDefinition); } beanDefinitions.add(beanDefinition); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 完成bean的实例化 */ private void instanceBeans(){ try { for (BeanDefinition beanDefinition : beanDefinitions) { if (beanDefinition.getClazz()!=null&&!"".equals(beanDefinition.getClazz().trim())) { sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClazz()).newInstance()); } } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 为bean对象的属性注入值 * @throws IntrospectionException * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ private void injectObject() { try { for (BeanDefinition beanDefinition : beanDefinitions) { Object bean=sigletons.get(beanDefinition.getId()); if (bean!=null) { PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); for(PropertyDefinition propertyDefinition:beanDefinition.getPropertyDefinitions()){ for (PropertyDescriptor propertyDescriptor : ps) { if (propertyDefinition.getName().equals(propertyDescriptor.getName())) { Method setterMethod=propertyDescriptor.getWriteMethod();//获取属性的setter方法 if (setterMethod!=null) { Object temp=null; if (propertyDefinition.getRef()!=null&&!"".equals(propertyDefinition.getRef().trim())) { temp=sigletons.get(propertyDefinition.getRef()); }else if (propertyDefinition.getValue()!=null&&!"".equals(propertyDefinition.getValue().trim())) { temp=ConvertUtils.convert(propertyDefinition.getValue(), propertyDescriptor.getPropertyType()); } setterMethod.setAccessible(true);//防止setter方法为private setterMethod.invoke(bean, temp);//把引用对象注入到属性 } break; } } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 通过注解实现注入依赖对象 * @throws IntrospectionException * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ private void annotationInject(){ try { for (String beanName : sigletons.keySet()) { Object bean=sigletons.get(beanName); if (bean!=null) { PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : ps) { Method setterMethod=propertyDescriptor.getWriteMethod(); if (setterMethod!=null&&setterMethod.isAnnotationPresent(UserDefinedResource.class)) { UserDefinedResource userDefinedResource=setterMethod.getAnnotation(UserDefinedResource.class); Object temp = null; if(userDefinedResource.name()!=null && !"".equals(userDefinedResource.name())){ //一旦指定了name属性,就只能按名称装配了 temp = sigletons.get(userDefinedResource.name()); }else{ temp = sigletons.get(propertyDescriptor.getName()); if(temp==null){ for(String key : sigletons.keySet()){ if(propertyDescriptor.getPropertyType().isAssignableFrom(sigletons.get(key).getClass())){ temp = sigletons.get(key); break; } } } } setterMethod.setAccessible(true); setterMethod.invoke(bean, temp);//把引用对象注入到属性 } } Field[] fields = bean.getClass().getDeclaredFields(); for(Field field : fields){ if(field.isAnnotationPresent(UserDefinedResource.class)){ UserDefinedResource userDefinedResource = field.getAnnotation(UserDefinedResource.class); Object temp = null; if(userDefinedResource.name()!=null && !"".equals(userDefinedResource.name())){ temp = sigletons.get(userDefinedResource.name()); }else{ temp = sigletons.get(field.getName()); if(temp==null){ for(String key : sigletons.keySet()){ if(field.getType().isAssignableFrom(sigletons.get(key).getClass())){ temp = sigletons.get(key); break; } } } } field.setAccessible(true);//允许访问private字段 field.set(bean, temp); } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获取bean实例 * @param beanName * @return */ public Object getBean(String beanName){ return this.sigletons.get(beanName); } }
package junit.test12; import static org.junit.Assert.*; import junit.test12.PersonService; import junit.test12.UserDefinedClassPathXMLApplicationContext; import org.junit.Test; public class SpringTest { @Test public void instanceSpring() { UserDefinedClassPathXMLApplicationContext applicationContext=new UserDefinedClassPathXMLApplicationContext("beans.xml"); PersonService personService=(PersonService) applicationContext.getBean("personService"); personService.save(); } }
- itcastSpring.rar (7 MB)
- 下载次数: 20
发表评论
-
java正则表达式修改html标签中属性
2013-04-21 11:45 4876package com.ez; import ... -
String.intern()解析
2012-07-16 22:53 1627String.intern()解析 Str ... -
Java中的访问控制public,private,protected,package
2012-05-08 02:41 28701. Java中的访问控制表1-1 可见/ ... -
Beginning SWT
2012-04-12 15:41 0SWT(Standard Widget Toolkit, ... -
Java IO读写大文件的几种方式及测试
2012-03-13 17:24 3440读取文件大小:1.45G 第一种,OldIO: (注意文件和系 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-03-13 17:25 1368最近的机器内存又爆满了,除了新增机器内存外,还应该好好r ... -
复习nio
2012-03-13 17:24 1785简介: JDK 1.4 中引入的新输入输出 (NIO) 库在 ... -
The Closeable, Flushable, Readable, and Appendable interfaces
2012-03-13 17:23 1911Java SE 5.0引入了4个附加的接口:C ... -
Java IO复习
2012-03-13 17:22 1435什么是流: 流是一个抽象的概念。当Java程序需要 ... -
spring事务(附件pdf)
2011-12-08 21:27 1706事务传播属性 REQUIRED ... -
Spring aop 简单总结
2011-12-08 16:59 2574先用jdk,cglib模拟下: 使用JDK动态代理 //当 ... -
Spring 积累
2011-12-08 17:23 1903三种实例化bean的方式 1.使用类构造器实例化 & ... -
Drools与Spring集成 登录测试
2011-11-26 23:09 21834Drools5.2.0.Final与Spring3集成测试 ... -
javaweb读取任意目录的下的properties配置文件(解决普通java类读web-inf下任意目录)
2011-10-28 15:59 11940看到很多用getResourcesAsStream()来读取. ... -
java程序员常用英语
2011-11-14 08:16 5632干程序员这行实在是 ... -
Spring管理filter和servlet,无硬编码bean
2011-10-25 08:23 5322Spring管理filter和servlet,无需硬编码 ... -
Oracle在2011年取得的Java主要成就
2011-10-20 08:29 2059甲骨文公司继续推动Java前进的战略。自2010年1月收购 ... -
Java规则引擎与其API(JSR-94)
2011-10-19 10:02 4251转自:http://www.ibm.com/developer ... -
Core Java , Volume 1 笔记
2011-07-17 11:36 051 StringBuffer:效率略低于String ... -
树形显示
2011-07-17 11:26 1681/** 树形结构应用十分广泛。 下面这段代码根据 ...
相关推荐
模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...
这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...
这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts框架的简单模拟。下面将逐一解析这些知识点。 **1. XML读取** XML(Extensible Markup Language)是一种通用的...
**模拟Spring的IOC** 在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC...
下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...
1. **配置文件解析**:在`springIOC_0602`项目中,我们有一个XML配置文件,它定义了bean的声明和它们的依赖。JDOM库被用来读取这个文件,解析bean的定义,包括bean的类名、属性、依赖等。 2. **Bean的创建**:解析...
在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...
本篇文章将详细解析“模拟Spring IOC技术”的核心概念,并通过一个小Demo帮助你深入理解IOC的工作原理。 首先,我们来解释一下什么是IOC和DI。控制反转(IOC)是编程中的一个设计原则,它改变了对象获取依赖的方式...
Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...
在`YQIoc`这个压缩包中,可能包含了实现简单模拟Spring IoC容器的代码。通常,这个模拟会包含以下几个部分: 1. **Bean定义**:这是描述对象如何创建和配置的数据结构。在我们的例子中,bean定义可能是以XML形式...
在提供的压缩包文件"xml_bean"中,可能包含了示例的XML配置文件和相关的Java类,你可以通过分析这些文件来加深对Java解析XML和模拟Spring IOC的理解。实际项目中,Spring框架提供了更高级的功能,如自动扫描、注解...
在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是如何工作的,以及如何通过Java代码来模拟这个过程。 首先,让我们了解什么是Spring的IoC。IoC是一种设计模式,它将...
在本文中,我们将深入探讨“模拟Spring IOC”的概念,以及如何通过自己实现的简单依赖注入来理解这个核心的Spring框架特性。Spring IOC,即Inversion of Control(控制反转),是软件设计模式的一种,它在Spring框架...
Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...
在这个名为"spring_IOC实现(墨者革离)"的项目中,我们可以通过模拟城门叩问的编剧场景来理解这一概念。 首先,控制反转的基本思想是将对象的创建和依赖关系的管理从应用程序中分离出来,交给一个外部容器(在...
例如,`SpringIOC`目录中的配置文件(如`applicationContext.xml`)用于定义bean的定义和它们之间的依赖关系。通过XML或注解方式声明bean,Spring可以自动管理bean的实例化、初始化和销毁,从而简化了代码并提高了可...
使用Java注解模拟Spring IOC容器过程解析 Java注解是一种特殊的语法结构,用于提供元数据来描述程序元素,如类、方法、字段等。Spring框架的IOC(Inversion of Control,控制反转)容器是Spring框架的核心组件之一...
描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...
本篇文章将详细探讨如何利用jdom2解析XML文档以及通过反射机制来模拟Spring的IoC功能。 首先,理解IoC的基本概念。IoC意味着不再由应用程序直接创建对象,而是由一个容器(如Spring IoC容器)来负责对象的生命周期...