- 浏览: 117992 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
wenbing2610:
其实用Struts实现图片上传比用Servlet实现容易多了。 ...
Struts2文件上传深入FileUploadInterceptor -
i_feng:
public class uploadImageAction ...
Struts2文件上传深入FileUploadInterceptor -
wenbing2610:
...
ognl.MethodFailedException
模拟了spring容器的依赖注入,其实spring内部也是通过反射机制来实现的控制反转。主要是看下spring包下的ClassPathXmlApplicationContext类的实现。
private String name;
return name;
}
this.name = name;
}
}
//设计这个接口,是为了更灵活,因此不同的数据库产品,实现方式不一样
//为了可扩展,把这里设计成接口
public interface UserDao {
public void save(User u);
}
import com.bjsxt.model.User;
System.out.println("a user is save.");
}
import com.bjsxt.model.User;
//这里我定义成接口类型,这样,我想用哪种数据库产品的实现
//我就new哪种,比如userDao = new UserDaoImpl(),如果我想换
//其它的实现,就更改下那句话就行,要是放在配置文件里,就只需更改配置文件
//这就是面向接口的编程
private UserDao userDao;
return userDao;
}
this.userDao = userDao;
}
public void save(User u){
userDao.save(u);
}
}
Object getBean(String id);
}
package spring;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
private Map<String,Object> beans = new HashMap<String,Object>();
public ClassPathXmlApplicationContext() throws JDOMException, IOException{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(ClassPathXmlApplicationContext.class
.getClassLoader().getResourceAsStream("beans.xml"));
Element root = doc.getRootElement();
List list = root.getChildren("bean");
for(int i=0;i<list.size();i++){
Element element = (Element) list.get(i);
String id = element.getAttributeValue("id");
String clazz = element.getAttributeValue("class");
Object o = null;
try {
//利用反射机制,根据完整的包名+类名,new出实例
o = Class.forName(clazz).newInstance();
beans.put(id, o);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
List elements = element.getChildren("property");
for(int j=0;j<elements.size();j++){
Element ele = (Element) elements.get(j);
String name = ele.getAttributeValue("name");//userDao
String bean = ele.getAttributeValue("bean");//u
Object beanObject = beans.get(bean);//userDaoImpl instance
//其实就相当于找方法名setUserDao;
String methodName = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
//根据反射机制,执行set方法,这里,先找到方法名,
//根据方法名和方法参数拿到method
// 比如,public void setUserDao(UserDao userDao),这里的方法参数userDao它实现了
//这样就完成了注入
Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
m.invoke(o, beanObject);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public Object getBean(String id) {
return beans.get(id);
}
}
<beans>
<bean id="u" class="com.bjsxt.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.bjsxt.service.UserService" >
<property name="userDao" bean="u"/>
</bean>
</beans>
测试代码如下:
package com.bjsxt.service;
import static org.junit.Assert.*;
import java.io.IOException;
import org.jdom.JDOMException;
import org.junit.Test;
import spring.ClassPathXmlApplicationContext;
import com.bjsxt.model.User;
public class UserServiceTest {
//junit4的特点就是不用显示继承TestCase,只要在那个方法前加上注解@Test
public void testSave() {
ClassPathXmlApplicationContext context = null;
try {
context = new ClassPathXmlApplicationContext();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
UserService us = (UserService) context.getBean("userService");
User u = new User();
us.save(u);
}
}
发表评论
-
CSS样式表的overflow属性
2015-01-02 19:22 28一、滚动条样式overflow ... -
jrebel运用
2014-07-13 22:00 1188JRebel热部署 ... -
JPA执行原生SQL截断Char类型问题
2014-05-24 21:39 1186在JPA的API中执行原生 ... -
JPA基本数据类型映射
2014-05-24 21:06 3902/** ... -
spring定时器配置
2014-03-18 21:36 691创建测试类: ... -
The Struts dispatcher cannot be found
2013-11-03 18:48 650运行环境:struts2环境中访 ... -
JasperException
2013-09-15 20:41 1014JasperException异常: ... -
equal symbol expected
2013-09-15 20:08 1180equal symbol ... -
Hibernate主键生成器
2013-09-12 21:11 787... -
Criterion和Criteria
2013-09-08 16:00 1945Hibernate Criter ... -
getHibernateTemplate用法
2013-09-08 15:02 581HibernateTemplate提供的方法 ... -
JS中页面跳转
2013-09-08 14:01 652<html><head><t ... -
GridPanel详解
2013-03-10 10:45 10341、Ext.grid.GridPanel ... -
tomcat内存溢出
2013-03-04 20:26 723在使用Java程序从数据库中查询大量的数据或 ... -
History Object
2013-01-07 21:06 750history 对象是window 对象的另一个子 ... -
Write to programmer
2012-12-29 20:16 853很多的java初级程序员对自己没有一个明确的方 ... -
EL语言
2012-09-27 22:08 892EL的前世今生: ... -
JSTL标签的使用
2012-09-27 22:00 807JSP 标准标记库( Standard Tag Library ... -
使用IBATIS防止sql注入
2012-08-26 21:17 1601对于ibaits参数引用可以使用#和$两 ... -
IBATIS动态SQL标签用法
2012-08-26 21:04 12491、动态SQL片段通过SQL片 ...
相关推荐
这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...
3. 如果一切正常,你会看到使用Java集合、XML API,以及反射技术模拟Spring的get注入和自定义的IoC容器实现的例子--get注入了Hello类和一个MyFrame类,并且实例化之后可以运行! 4. 看一下testDemoSpringDI()方法,...
- **框架开发**:Spring框架利用反射机制进行依赖注入(DI)和面向切面编程(AOP)。 - **单元测试**:JUnit等测试框架利用反射机制模拟方法调用和验证方法结果。 - **热插拔**:在某些服务器端应用中,利用反射机制...
这篇博客“java模拟spring ioc”很可能是探讨如何在没有Spring框架的情况下,使用纯Java代码来实现类似Spring的IOC功能。以下将详细介绍Spring的IOC和DI概念以及如何模拟这些概念。 **依赖注入(Dependency ...
模拟Spring的依赖注入,旨在理解其核心机制,让我们一起深入探讨这一主题。 首先,我们要明白什么是依赖注入。在传统的编程中,一个对象通常会直接创建或查找它所依赖的对象,这会导致类之间的紧密耦合。依赖注入则...
现在,我们将深入探讨如何通过自己的代码来模拟Spring的依赖注入。 首先,理解依赖注入的概念至关重要。依赖注入意味着组件不直接创建其依赖的对象,而是由外部实体(如Spring IoC容器)提供。这样做的好处是,我们...
5. **实例化Bean**:根据`class`属性创建Bean的实例,可以使用Java反射API来完成。 6. **注入属性**:使用反射API设置Bean的属性值,这包括基本类型和复杂类型的属性,以及对其他Bean的引用。 7. **初始化Bean**:...
这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts框架的简单模拟。下面将逐一解析这些知识点。 **1. XML读取** XML(Extensible Markup Language)是一种通用的...
通过Java反射API,我们可以动态地调用对象的setter方法,注入依赖的对象。 **8. 生命周期管理** 对于有初始化或销毁方法的Bean,我们需要在适当的时候调用这些方法。可以提供接口,如`init()`和`destroy()`,并在...
Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,IoC)。在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是...
标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...
本资源名为“模拟spring和工具jar包”,其目的是为了帮助我们理解Spring框架的核心概念——依赖注入,并通过一个简化版的实现来学习这一机制。 依赖注入是Spring框架的核心特性之一,它允许我们在不直接创建对象的...
本文将通过模拟Spring的`BeanFactory`来深入理解其工作原理,帮助开发者更好地掌握Spring的核心概念。 `BeanFactory`是Spring框架中最基础的bean管理容器,它是所有更高级别的容器(如`ApplicationContext`)的基类...
在IT行业中,Spring框架是Java开发中的一个核心组件,它以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)功能而闻名。本篇文章将详细解析“模拟Spring IOC技术”的...
在Spring中,实现IOC的主要方式有两种:依赖注入(Dependency Injection,DI)和基于XML的配置。在这个项目中,可能结合了这两种方法。依赖注入可以通过构造函数注入、setter方法注入或接口注入来实现,使得对象间的...
Spring框架是Java开发中不可或缺的一部分,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心,极大地简化了企业级应用的开发。本篇文章将深入探讨Spring框架的...
Spring框架是Java开发中最常用的轻量级框架之一,它的核心特性是依赖注入(Dependency Injection,简称DI),也常被称为控制反转(Inversion of Control,简称IoC)。控制反转是一种设计模式,它改变了传统应用程序...
Spring框架是Java应用程序开发中的一个核心组件,它提供了一个依赖注入(DI)和面向切面编程(AOP)的解决方案。在Spring中,`ClassPathXmlApplicationContext`是用于加载和管理配置元数据的一个重要类,它允许我们...
这涉及到对Java反射机制的理解,以及如何通过设计模式来解耦代码。 在压缩包文件"spring-Imitation"中,你可以找到相关的代码实现,这些代码应该包含了Spring核心功能的简化版本。通过阅读和分析这些代码,你可以更...
Spring使用反射机制,可以动态地为Java对象注入依赖,这样就可以在运行时构建整个对象图,实现松耦合和高度可配置的应用。 在具体编码中,Spring依赖注入通常通过XML配置文件或Java注解的方式来实现。在Spring的...