- 浏览: 813367 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (307)
- struts (8)
- hibernate (3)
- spring (32)
- opensourceproject (12)
- javaScript (9)
- primeton EOS (2)
- journey of heart (10)
- Design pattern (6)
- ejb (17)
- point (37)
- Linux&Unix (22)
- ibatis (10)
- AJAX (6)
- DB (26)
- Protocol (6)
- chart (4)
- web server (11)
- webservice (7)
- integration (3)
- tuxedo (5)
- ext (4)
- android (1)
- c/c++ (12)
- JVM (1)
- paginationFrame (2)
- code (2)
- report (1)
- High-performance web (1)
- svn (1)
- JQuery (1)
- workDaily (2)
- cloud (16)
- Python (8)
- English (2)
- shell (5)
- googleCode (1)
- nio (1)
- hyper-v (1)
- debug (3)
- vbs (2)
- openstack (3)
- K8S (1)
- Mesos (0)
- Spark (0)
- Marathon (0)
最新评论
-
钱图大展:
chao2751021 写道lib包哪里去下载,找不到
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
钱图大展:
无法下载
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
fm395728572:
shell脚本中用到了环境变量,但是获取不到,例如脚本中有一句 ...
ganymed-ssh2 for Java -
liuhanjiang:
我qq147229234
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
liuhanjiang:
博主 我利用您提供的方法实现博文中介绍的clickstream ...
大型网站用户行为记录的一个实现--基于clickStream(第一部分)
下面我们使用模拟spring容器,来完成Spring容器基本类型的注入,还是使用 ItcastClassPathXMLApplicationContext.java 来模拟spring 容器 注入String类型,int类型.等基本类型,以前我们都是注入的ref引用的 依赖对象
步骤:首先给PersionServiceBean.java 增加string 类型的变量 name,和int类型的变量 age
package cn.com.xinli.service.impl;
import org.apache.log4j.Logger;
import cn.com.xinli.dao.PersionDao;
import cn.com.xinli.service.PersionSevice;
public class PersionServiceBean implements PersionSevice
{
Logger log=Logger.getLogger(PersionServiceBean.class);
private PersionDao persionDao;
private String name;
private int age;
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public PersionDao getPersionDao()
{
return persionDao;
}
public void setPersionDao(PersionDao persionDao)
{
this.persionDao = persionDao;
}
public void init()
{
log.info("初始化资源");
}
public PersionServiceBean()
{
log.info("我被实例化了");
}
public void save()
{
log.info("name:"+name);
log.info("age:"+age);
this.persionDao.add();
}
public void destory()
{
log.info("释放资源");
}
}
(2) 修改 ItcastClassPathXMLApplicationContext 容器代码,主要是修改在容器读beans.xml配置文件的时候读到属性的值,和在注入时候完成对基本类型的注入.还需要修改 PropertyDefinition.java 加上一个value属性,和get,set方法 .
package junit.test; import java.beans.Introspector; import java.beans.PropertyDescriptor; 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.apache.commons.beanutils.ConvertUtils; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; import org.springframework.core.Conventions; /** * 实现的spring容器一样的功能 * */ public class ItcastClassPathXMLApplicationContext { Logger log=Logger.getLogger(ItcastClassPathXMLApplicationContext.class); private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>(); private Map<String, Object> sigletons = new HashMap<String, Object>(); public ItcastClassPathXMLApplicationContext(String filename){ this.readXML(filename); this.instanceBeans(); this.injectObject(); } /** * 为属性注入值 */ private void injectObject() { for(BeanDefinition beanDefinition : beanDefines){ Object bean = sigletons.get(beanDefinition.getId()); if(bean!=null) { try { //得到bean对象所有的属性声明,返回的是一个数组 PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); for(PropertyDefinition propertyDefinition : beanDefinition.getPropertys()) { for(PropertyDescriptor properdesc : ps) { //如果xml中读取的属性名字是bean对象属性的名字 if(propertyDefinition.getName().equals(properdesc.getName())) { //setter方法是写方法 Method setter = properdesc.getWriteMethod(); //获取属性的setter方法 ,如果方法是private需要调用 if(setter!=null) { if(propertyDefinition.getRef()!=null && !"".equals(propertyDefinition.getRef())) { Object value = sigletons.get(propertyDefinition.getRef()); setter.setAccessible(true); setter.invoke(bean, value);//把引用对象注入到属性 } else { Object value = ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType()); setter.setAccessible(true); setter.invoke(bean, value);//把引用对象注入到属性 } } break; } } } } catch (Exception e) { } } } } /** * 完成bean的实例化 */ private void instanceBeans() { for(BeanDefinition beanDefinition : beanDefines){ try { if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim())) sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance()); } catch (Exception e) { e.printStackTrace(); } } } /** * 读取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); 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"); propertysub.setNamespaceURIs(nsMap);//设置命名空间 List<Element> propertys = propertysub.selectNodes(element); for(Element property : propertys){ String propertyName = property.attributeValue("name"); String propertyref = property.attributeValue("ref"); String propertyValue = property.attributeValue("value"); log.info(propertyValue); PropertyDefinition propertyDefinition = new PropertyDefinition(propertyName, propertyref,propertyValue); beanDefine.getPropertys().add(propertyDefinition); } beanDefines.add(beanDefine); } }catch(Exception e){ e.printStackTrace(); } } /** * 获取bean实例 * @param beanName * @return */ public Object getBean(String beanName){ return this.sigletons.get(beanName); } }
注意:
a.红色加粗的 的代码 我们使用了 commons-beanutils.jar 提供的方法,它能根据属性的类型完成转换,可以把String->int 等,因为我们在配置文件一般都是这样写的 <property name="age" value="26"/> 这个工具方法就可以帮助我们把26 这个string类型转换为 int类型.
b.蓝色的代码 表示 当ref不为空的情况下 我们为属性注入引用对象,否则直接注入配置文件中属性所代表的值.
c. 咖啡色 代码 标识我们构造属性bean的使用在加一个类型.
(3) 在 PersionServiceBean.java 中我们使用bean.xml中的name和age属性, 看看自己的 ItcastClassPathXMLApplicationContext 使用完成了属性的注入
package cn.com.xinli.service.impl; import org.apache.log4j.Logger; import cn.com.xinli.dao.PersionDao; import cn.com.xinli.service.PersionSevice; public class PersionServiceBean implements PersionSevice { Logger log=Logger.getLogger(PersionServiceBean.class); private PersionDao persionDao; private String name; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public PersionDao getPersionDao() { return persionDao; } public void setPersionDao(PersionDao persionDao) { this.persionDao = persionDao; } public void init() { log.info("初始化资源"); } public PersionServiceBean() { log.info("我被实例化了"); } public void save() { log.info("name:"+name); log.info("age:"+age); this.persionDao.add(); } public void destory() { log.info("释放资源"); } }
(4)测试
ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml");
PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean");
ps.save();
(5) 结果
2009-05-30 11:08:46,203 INFO (PersionServiceBean.java:44) - 我被实例化了
2009-05-30 11:08:47,187 INFO (PersionServiceBean.java:49) - name:huxl
2009-05-30 11:08:47,187 INFO (PersionServiceBean.java:50) - age:26
2009-05-30 11:08:47,187 INFO (PersionDaoBean.java:15) - 执行了PersionDaoBean中的add()方法
发表评论
-
hibernatetemplate类使用
2010-03-19 22:25 1213http://115893520.iteye.com/blog ... -
Spring 中的JdbcTemplate使用
2010-03-19 22:11 35201.JdbcTemplate的execute()方 ... -
SpringAOP 的使用(两种方式)
2009-10-22 13:42 1536使用Spring AOP 拦截 方法,给被拦截的 ... -
第30讲--Spring提供的CharacterEncoding和OpenSessionInView功能
2009-09-19 18:24 1815CharacterEncoding: 在web ... -
第29讲--为Spring集成的Hibernate配置二级缓存
2009-09-18 00:29 3417合理的使用缓存策略,往往在web开发中提高性能起到关键 ... -
第28讲--Struts与Spring集成方案2(Spring集成Struts)
2009-09-17 00:57 1662集成步骤: 1.和方案1一样需要在web. ... -
第27讲--Struts与Spring集成方案1(Struts集成Spring)
2009-09-16 08:25 1849Spring2.5+Hibernate3.3+Stru ... -
第25,26讲 --搭建和配置Spring与Hibernate整合的环境
2009-06-21 11:21 1623Spring2.5+Hibernate3.3+Stru ... -
第24讲 --使用Spring配置文件实现事务管理
2009-06-20 23:56 1786采用基于XML方式配置事务 <bean ... -
第23讲 --使用Spring注解方式管理事务与传播行为详解
2009-06-11 23:19 2263事务传播属性 REQUIR ... -
第21,22讲 --搭建和配置Spring与jdbc整合的环境+Spring集成的jdbc编码和事务
2009-06-10 08:06 2709Spring+JDBC组合开发配置数据源有两种方式: ... -
第20讲--aspectj的切入点语法定义细节
2009-06-06 17:47 3660表达式分析: expression=" ... -
第19讲 --使用Spring配置文件实现AOP
2009-06-06 17:21 1564上面我们是使用注解的方式实现spring AOP的,下面 ... -
第18讲 --使用Spring的注解方式实现AOP的细节
2009-06-06 15:48 1583上一讲我们使用spring注解的方式理由aop技术 ... -
第17讲 --使用Spring的注解方式实现AOP入门
2009-06-05 00:48 2288使用Spring进行面向切面(AOP)编程 要 ... -
第16讲 --使用CGLIB实现AOP功能与AOP概念解释
2009-06-04 07:42 1660当代理对象没有实现 ... -
第15讲 --使用JDK中的Proxy技术实现AOP功能
2009-06-04 07:34 2347当目标类实现了接口,我们可以使用jdk的Proxy ... -
第14讲 --让Spring自动扫描和管理Bean
2009-06-02 23:40 8767通过在classpath自动扫描方式把组件纳入sp ... -
第13讲 --Autowire注解与自动装配
2009-06-02 22:46 31521. Autowire 默认是 ... -
第12讲 --编码剖析@Resource注解的实现原理
2009-06-01 23:14 3311在这一讲开始之前,我们先学习一下jdk5.0 中的一个新 ...
相关推荐
《深入解析SPRING架构与设计原理(第2版)》是一部深入探讨Spring框架核心机制和技术细节的著作。这本书旨在帮助读者全面理解Spring的工作原理,掌握其设计思想,并能灵活运用到实际开发中。标签"Spring"表明了主要...
8. **Spring Boot**:虽然《Spring攻略(第一版)》可能不包含Spring Boot的内容,但理解Spring的基本原理对于学习Spring Boot至关重要,因为Spring Boot是基于Spring框架的快速开发工具。 通过仔细研读这份源码,...
《SPRING技术内幕:深入解析SPRING架构与设计原理第2版》这本书是Spring框架学习者和开发者的重要参考资料。Spring作为Java生态系统中的核心组件,它以其模块化、易用性和强大的功能深受广大开发者喜爱。本篇文章将...
### 第8章:Spring JDBC支持 该章节聚焦于Spring框架提供的JDBC支持,包括如何利用Spring JDBC模板来简化数据库操作,提高代码的异常处理能力和资源管理效率。读者将学会如何在Spring中执行数据库查询、更新、批量...
第8章 Struts 2进阶 第9章 Struts 2的* 第10章 Struts 2的类型转换 第11章 Struts 2的输入校验 第12章 文件的上传和下载 第13章 国际化 第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用...
- `Spring_8_AOP_1` 可能是系列教程的第一部分,讲解了AOP的基本概念和使用场景。 通过这个简单的入门例子,你可以逐步掌握Spring的基本用法,包括依赖注入和面向切面编程的实践。同时,结合提供的文件,你可以...
第8章 Struts 2进阶 第9章 Struts 2的* 第10章 Struts 2的类型转换 第11章 Struts 2的输入校验 第12章 文件的上传和下载 第13章 国际化 第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16...
Spring框架是Java开发中不可或缺的重要组成部分,其源码解析对于深入理解其工作原理和技术细节至关重要。本资源提供了可以直接导入Eclipse的Spring 4.3.18版本源码,简化了开发者研究源码的前期准备步骤。在这一部分...
【SSM网上服装销售系统】是一个综合性的项目,它结合了Spring、SpringMVC和MyBatis三个核心组件,构建了一个高效、灵活的Java Web应用。这个系统旨在为用户提供便捷的在线购物体验,特别是针对服装商品。以下是这个...
它在Windows环境下部署,采用UTF-8编码,确保跨平台的兼容性和多语言支持。使用的JDK版本为1.8,这是Java SE 8,引入了许多重要的新特性,如Lambda表达式、Stream API和日期时间API,提高了代码的简洁性和性能。 1....
需求分析是系统开发的第一步,包括需求概述、功能需求和非功能需求。例如,系统可能需要管理团员的基本信息、活动记录、团费缴纳情况等功能,并且要保证系统的安全性、稳定性、易用性等非功能需求。 9. **系统设计...
【ssm项目源码】停车场管理系统是一个基于Java技术的Web应用程序,主要...通过学习和实践此类项目,开发者不仅可以提升Java Web开发技能,还能了解到完整的项目开发流程,包括需求分析、设计、编码、测试和运维等环节。
通过对这些知识点的深入理解和实践,开发者可以掌握一套完整的Web应用程序开发流程,从需求分析、设计、编码到测试和部署。这个基于SSM+JSP的网上服装销售系统源码数据库为学习者提供了一个很好的实践平台,有助于...
2.2. SpringExt原理 ......................................................................................... 16 2.2.1. XML Schema中的秘密 ...............................................................