- 浏览: 7356535 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
在spring 2.0 中,增加了自定义xml标记这一重大的功能。下面主要看一下spring 2.0实现这一功能的主要相关类: NamespaceHandlerResolver(接口) 实现类: String location = "org/springframework/beans/factory/xml/support/customNamespace.properties"; 实现类: 实际的操作由具体的BeanDefinitionDecorator 或者BeanDefinitionParser 执行 BeanDefinitionDecorator(接口) 装饰相关的自定义属性。 AbstractInterceptorDrivenBeanDefinitionDecorator 其他类: PluggableSchemaResolver,用于自定义相关的schema,默认的schema 保存于spring.schemas文件中 可以通过覆盖resolveEntity方法来装载相应的自定义xsd文件 主要的执行类: 实际的类,就介绍到这,下一节通过实例来说明如何定义自定义xml 元素 |
看了spring test 用例,其实实现这一功能还算比较简单,主要分以下的步骤,具体的实例可以去参考spring 自带的testcase 首先定义相关xsd文件,用于验证相应的行为:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
定义Handler: 主要注册相应的解析类和装饰类
publicclass TestNamespaceHandler extends NamespaceHandlerSupport { publicvoid init() { //相对于每个xsd中定义的元素 registerBeanDefinitionParser("testBean", new TestBeanDefinitionParser()); registerBeanDefinitionDecorator("set", new PropertyModifyingBeanDefinitionDecorator()); registerBeanDefinitionDecorator("debug", new DebugBeanDefinitionDecorator()); registerBeanDefinitionDecorator("nop", new NopInterceptorBeanDefinitionDecorator()); registerBeanDefinitionDecoratorForAttribute("object-name", new ObjectNameBeanDefinitionDecorator()); } }
定义各个解析类: privatestaticclass TestBeanDefinitionParser implements BeanDefinitionParser { public BeanDefinition parse(Element element, ParserContext parserContext) { RootBeanDefinition definition = new RootBeanDefinition(); definition.setBeanClass(TestBean.class);
MutablePropertyValues mpvs = new MutablePropertyValues(); mpvs.addPropertyValue("name", element.getAttribute("name")); mpvs.addPropertyValue("age", element.getAttribute("age")); definition.setPropertyValues(mpvs);
parserContext.getRegistry().registerBeanDefinition(element.getAttribute("id"), definition);
returnnull; } } privatestaticclassPropertyModifyingBeanDefinitionDecorator implements BeanDefinitionDecorator { public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) { Element element = (Element)node; BeanDefinition def = definition.getBeanDefinition();
MutablePropertyValues mpvs = (def.getPropertyValues() == null) ? new MutablePropertyValues() : def.getPropertyValues(); mpvs.addPropertyValue("name", element.getAttribute("name")); mpvs.addPropertyValue("age", element.getAttribute("age"));
((AbstractBeanDefinition) def).setPropertyValues(mpvs); return definition; } } privatestaticclassDebugBeanDefinitionDecorator extends AbstractInterceptorDrivenBeanDefinitionDecorator {
protected BeanDefinition createInterceptorDefinition(Node node) { returnnew RootBeanDefinition(DebugInterceptor.class); } } privatestaticclassNopInterceptorBeanDefinitionDecorator extends AbstractInterceptorDrivenBeanDefinitionDecorator {
protected BeanDefinition createInterceptorDefinition(Node node) { returnnew RootBeanDefinition(NopInterceptor.class); } } privatestaticclassObjectNameBeanDefinitionDecorator implements BeanDefinitionDecorator { public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) { Attr objectNameAttribute = (Attr)node; definition.getBeanDefinition().setAttribute("objectName", objectNameAttribute.getValue()); return definition; } }
可以定义EntityResolver,用于验证相应的xsd privateclass DummySchemaResolver extends PluggableSchemaResolver {
public DummySchemaResolver() { super(CustomNamespaceHandlerTests.this.getClass().getClassLoader()); }
public InputSource resolveEntity(String publicId, String systemId) throws IOException { InputSource source = super.resolveEntity(publicId, systemId); if (source == null) { Resource resource = source = new InputSource(resource.getInputStream()); source.setPublicId(publicId); source.setSystemId(systemId); } return source; } } 关键的一步,如何生效: String location = "org/springframework/beans/factory/xml/support/customNamespace.properties"; NamespaceHandlerResolver resolver = new DefaultNamespaceHandlerResolver( DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); reader.setNamespaceHandlerResolver(resolver); reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_XSD); reader.setEntityResolver(new DummySchemaResolver()); reader.loadBeanDefinitions(getResource()); 写一个测试xml文件:
相关的测试方法: publicvoid testSimpleParser() throws Exception { TestBean bean = (TestBean) this.beanFactory.getBean("testBean"); assetTestBean(bean); } publicvoid testSimpleDecorator() throws Exception { TestBean bean = (TestBean) this.beanFactory.getBean("customisedTestBean"); assetTestBean(bean); } publicvoid testProxyingDecorator() throws Exception { ITestBean bean = (ITestBean) this.beanFactory.getBean("debuggingTestBean"); assetTestBean(bean); assertTrue(AopUtils.isAopProxy(bean)); Advisor[] advisors = ((Advised) bean).getAdvisors(); assertEquals("Incorrect number of advisors", 1, advisors.length); assertEquals("Incorrect advice class.", DebugInterceptor.class, advisors[0].getAdvice().getClass()); } publicvoid testChainedDecorators() throws Exception { ITestBean bean = (ITestBean) this.beanFactory.getBean("chainedTestBean"); assetTestBean(bean); assertTrue(AopUtils.isAopProxy(bean)); Advisor[] advisors = ((Advised) bean).getAdvisors(); assertEquals("Incorrect number of advisors", 2, advisors.length); assertEquals("Incorrect advice class.", DebugInterceptor.class, advisors[0].getAdvice().getClass()); assertEquals("Incorrect advice class.", NopInterceptor.class, advisors[1].getAdvice().getClass()); } publicvoid testDecorationViaAttribute() throws Exception { RootBeanDefinition beanDefinition assertEquals("foo", beanDefinition.getAttribute("objectName")); } privatevoid assetTestBean(ITestBean bean) { assertEquals("Invalid name", "Rob Harrop", bean.getName()); assertEquals("Invalid age", 23, bean.getAge()); } |
发表评论
-
【转】在项目中使用多个数据源-多sessionFactory方案
2013-05-10 16:30 3143适用范围:适合SSH架构访问多个数据库, ... -
【转】使用spring的动态路由实现数据库负载均衡
2013-03-17 22:57 3321使用spring的动态路由实现数据库负载均衡 系统中 ... -
【转】spring 数据库读写分离
2013-03-17 22:56 2820什么是数据库的读写分离 数据库的读写分离简单的说是把对数据 ... -
[转]Spring+iBatis+JOTM实现JTA事务
2013-03-17 22:51 3076Spring+iBatis+JOTM实现JTA事务 ... -
Spring 和Axis2整合相关那些事
2012-12-29 12:58 10428Axis2优劣: 现在用axis2开发一个webse ... -
【转】JAVA并发容器代码随读
2012-12-06 15:29 2962转载自 http://rdc.taobao.c ... -
Spring3.04和Junit4
2011-11-27 18:15 4411在Spring3.x以上必须采用 ... -
Spring加载属性文件的扩展
2011-08-22 12:21 3037在项目中一个属性文件配置信息,提供给数据连接信息 ... -
Brap和Spring整合(简单权限验证)
2011-07-26 10:31 1401在使用Spring的发 ... -
Quartz的任务的临时启动和暂停和恢复
2011-07-16 10:18 40283在项目中需要手动启停某些服务,那么需要有一个控 ... -
Quartz中定时调度EJB3.0服务
2011-07-13 22:25 2946在quartz2.0中只支持EJb2.0的服务 ... -
Quartz中定时调度EJB2.0服务
2011-07-13 22:12 2192在Quartz2.0中提供支持EJB2.0 ... -
Quartz的简单使用
2011-07-13 22:05 9968最近工作需要学习quartz,那么必须首先了解三个概念:调度器 ... -
Brap 远程访问调用 和Spring整合(二)
2010-12-08 14:52 2015Brap和 Spring 整合使用如 ... -
闲着没事Hessian开发WebService的总结(二)
2010-12-07 20:30 4052在Spring和Hessian整合中,以前 ... -
Spring JMX的学习总结(三) 基于注释的JMX的使用
2010-12-03 17:26 3369具体实现JMX的注释的类: package c ... -
Spring JMX的总结学习(二) 注解实现MBean
2010-12-03 17:24 6299本文采用Spring JMX ... -
Spring JMX的总结学习(一)基于标准接口的JMX
2010-12-03 17:21 3789在Spring中采用JMX标准形式的,开发相关的Spr ... -
Spring JMS的开发应用--自定义消息转换器的使用(四)
2010-12-03 01:37 2526在Spring JMS、中可以通过实现Me ... -
Spring JBOSSMQ JMS的开发应用(三)
2010-11-30 20:11 2356如果用过JMS的话,会发现它类似写JD ...
相关推荐
通过深入研究Spring 2.0源代码,开发者可以更好地理解其设计思想,优化自己的代码,并能够自定义和扩展Spring的功能,以满足特定项目需求。无论是为了学习、调试还是贡献代码,了解Spring 2.0源代码都将是一个宝贵的...
DI是Spring的核心特性,通过源码,我们可以学习到如何定义bean的配置,如何使用`@Autowired`和`@Qualifier`注解实现自动装配,以及如何自定义bean的生命周期。对于AOP,可以研究`@Aspect`和`@Pointcut`注解,理解切...
1. Bean管理:Spring 2.0强化了Bean的生命周期管理,支持基于注解的配置(@Component、@Service、@Repository、@Controller),简化了XML配置,使得代码更加简洁。 2.依赖注入(DI):通过@Autowired注解,Spring...
Spring 2.0引入了大量的注解,如`@Autowired`、`@Service`、`@Repository`和`@Controller`,使得开发者可以摆脱XML配置,实现更简洁的依赖注入。`@Autowired`自动匹配类型,减少手动装配工作;`@Component`、`@...
### Spring Boot 2.0官方参考文档知识点梳理 #### 一、Spring Boot 2.0简介与系统需求 - **Spring Boot**是一个基于Spring框架的全新子项目,它旨在简化新Spring应用的初始搭建以及开发过程。该版本为2.0.0.BUILD-...
**Spring Data JPA 2.0 标准模板详解** Spring Data JPA 是 Spring 框架的一个子项目,它简化了数据访问层的开发,提供了对 Java Persistence API(JPA)的高度抽象和自动化。在 Spring Data JPA 2.0 版本中,它...
Spring 2.0增强了XML配置的扩展性,允许用户自定义命名空间和元素,方便构建自己的配置元数据。 - **Annotation驱动配置** Spring 2.0引入了注解支持,如`@Component`、`@Service`、`@Repository`和`@Controller...
XML文档可以包含自定义的标签来描述数据,这使得XML成为跨平台和应用程序间数据交换的理想选择。 【JSP与XML的结合】 1. **JSP中的XML处理** JSP可以通过使用JSP动作元素(JSP Actions)如`<jsp:include>`、`...
6. **事务管理**:Spring 的事务管理能力使得可以在方法级别控制事务,例如使用 `@Transactional` 注解标记需要事务的方法。 7. **测试**:编写测试用例验证集成是否正确,确保数据持久化和事务管理等功能正常工作...
除了内置的注解,Spring还支持自定义注解,只需在自定义注解上添加`@Component`注解,即可赋予其标记Bean的能力。虽然这一特性不常用,但它展示了Spring的高度灵活性。 ##### BeanNameGenerator与自定义命名策略 ...
3. **兼容性好**:"pager-taglib-2.0" 兼容各种主流的Web框架,如Spring MVC、Struts等,可以无缝集成到现有的项目结构中。 4. **智能分页**:它能根据数据库记录总数自动计算出页码,并支持跳转至任意页的功能,还...
Spring Security的前身是Acegi Security,在Spring 2.0发布时被整合进Spring框架中,并更名为Spring Security。随着版本的迭代,Spring Security不断引入新特性和改进,以适应不断变化的安全需求和技术环境。 #####...
在`pom.xml`中,引入`spring-boot-starter-parent`作为父POM,它提供了依赖管理,确保所有依赖的版本一致。另外,引入`spring-boot-starter-web`,它是SpringBoot的Web核心组件,包含了SpringMVC和其他必要的Web开发...
4. **自定义标记**:扩展系统,创建自定义的重写标记,以满足特定的应用场景需求。 5. **与Web框架集成**:与Spring MVC、Struts、JSF等常见Java Web框架兼容,方便集成。 6. **性能优化**:设计上考虑了性能,...
Spring 框架自2.0 版本起引入了一系列注解支持,这极大简化了配置管理,并为开发提供了更为简洁灵活的方式。通过注解,可以将业务逻辑与配置分离,减少XML配置文件的编写工作,提高开发效率。 #### 二、核心注解...
- **自动配置**:开箱即用,对Spring进行大量预设配置,但同时也允许自定义配置。 - **生产就绪**:包括性能监控、健康检查、外部配置等功能。 - **无XML配置**:强调Java配置,避免XML配置文件。 【Java配置...
**SpringBoot 2.0**:这是Spring框架的一个子项目,旨在简化Spring应用的初始搭建以及开发过程。它预配置了许多常见的设置,如服务器、数据库、MVC、安全等,使得开发者能够快速上手并专注于业务逻辑。SpringBoot ...
1. **页面元素**:JSP页面由HTML或XML标记和JSP元素组成,包括指令、脚本元素和动作元素。例如,`<jsp:include>`用于在页面中插入其他文件,`<jsp:useBean>`用于实例化JavaBean。 2. **指令**:如`<%@ page %>`, `...
- `activiti-engine.jar`:这是Activiti的核心,包含流程引擎,用于解析流程定义(BPMN 2.0 XML文件),执行流程实例,并处理所有与流程相关的任务。 - `activiti-common-db.jar`:提供数据库连接和事务管理的支持...