- 浏览: 365949 次
- 性别:
- 来自: 阿里巴巴
文章分类
- 全部博客 (207)
- Maven (5)
- Cassandra (2)
- Hadoop (3)
- LDAP (2)
- SOA (7)
- 认证、加密、安全 (6)
- 搜索引擎相关技术 (3)
- REST (7)
- 数据库 (11)
- Java 基础相关 (38)
- UML (1)
- Java NIO 框架 (3)
- javassist (1)
- Bean容器 (4)
- 网络编程 (1)
- NoSQL (4)
- XML、Json (1)
- JS (2)
- Google (6)
- Warp-MVC (2)
- 持久层 (2)
- sitebricks (1)
- MVC (6)
- CSS (2)
- JPA (2)
- RDBMS (5)
- cache (4)
- tomcat (1)
- 其它 (3)
- eclipse (1)
- bigpipe (1)
- RDBMS MySQL (1)
- MySQL (2)
- ant (1)
- 前端 (2)
- Groovy (1)
- linux (3)
- Scala (1)
- zookeeper (1)
- redis (2)
- 测试 (1)
- 监控 (1)
- mac (3)
- 区块链 (3)
- 工具 (1)
最新评论
-
masuweng:
好好好,辛苦了!!
Spring Data JPA 简单介绍 -
masuweng:
Spring Data JPA 简单介绍 -
zhangjianxinjava:
您好,大神本人小白一个最近在研究不知道可否 通过邮箱进行交流, ...
JAVA Metrics度量工具 - Metrics Core -
xzs603:
http://zhengdl126.iteye.com/blo ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
JavaStart:
运行mysql2redis 的install.sh 文件为何提 ...
mysql到redis的复制
mule2.2.1已经采用从spring2.0开始出现的namespace配置方式了,这样的好处不多说了,坏处是源码更难看了,还增加了一坨BDP。以下是spring官方手册的附录B及spring源码的一些摘录。 Spring2.0's extensible XML configuration mechanism基础是xml的schema(xsd),总体来说首先需要NamespaceHandler空间处理器,然后空间处理器来根据xml配置的元素名注册BeanDefinitionParser定义解析器(有两种类型:BDP和BDD)。org.springframework.beans.factory.xml.NamespaceHandler的说明是:被DefaultBeanDefinitionDocumentReader所使用的空间处理器基本接口,是专用于处理自定义空间的。实现类应返回以下两种策略接口的实现(这两种实现也就是定义解析器的两种类型): spring的xml配置解析器遇到beans直接下属的自定义标签(顶级)应调用parse方法、遇到bean下属的自定义标签应调用decorate方法。要编写自定义空间解析不要直接实现本接口、应该继承NamespaceHandlerSupport类。NamespaceHandler接口定义了3个方法: NamespaceHandler定义了这3个方法,不管你怎么去实现(接口都是甩手掌柜),spring的NamespaceHandlerSupport类提供了一种简单直观的实现,那就是应用自己负责先批量地把一堆Element本地名与相应的解析器(也是应用自己的实现)实例关联映射起来,然后在调用parse或decorate的时候再去拿出相应解析器来解析。这个关联映射在哪里做?只能是在init方法中,所以说NamespaceHandler这个接口很可能是后期抽象出来的,完全按照实际的解析需要抽象出来必要的3个方法,所以说接口往往是根据下面的实现后期抽象出来的,实现早于接口而存在,既然实现都有了还抽象接口干嘛用呢?可能在后期也有用——这就是重构干的事儿。 NamespaceHandlerSupport:实现自定义空间处理器的帮助类。它的三对Map成员和注册方法共同构成了解析器注册的基础功能: 根据上述、继承NamespaceHandlerSupport的空间处理器的自定义编写非常简单,它只留给你一个需要实现的方法:init()。你只要实现init方法注册一堆你的解析器即可。 如果是解析顶级的自定义标记相对比较简单,实现个NamespaceHandlerSupport、再实现个AbstractSingleBeanDefinitionParser即可。但是对于非顶级的嵌套自定义标签以及自定义属性等等就没那么简单了。 对应类是: 注意对于成员components并没有提供一个setter方法供你注入!对这种问题的解决方式是创建一个自定义工厂bean来暴露一个setter方法: 除了一点上述工厂bean工作良好:暴露了过多的spring内部装配细节,我们用自定义标签解析器来做这件事,按步骤来: o了。 二、“一般”元素(非自定义空间配置元素)的自定义属性的解析 写定义解析器和注册并不难,但有时你需要向已存在的bean定义添加元数据,比如带空间限定的自定义属性。这种自定义属性的情况在mule中尚未见到就先不译了,原文拷贝: By way of another example, let's say that the service class that you are defining a bean definition for a service object that will (unknown to it) be accessing a clustered JCache, and you want to ensure that the named JCache instance is eagerly started within the surrounding cluster: What we are going to do here is create another Now onto the custom extension. Firstly, the authoring of the XSD schema describing the custom attribute (quite easy in this case). Next, the associated Next, the parser. Note that in this case, because we are going to be parsing an XML attribute, we write a Lastly, the various artifacts need to be registered with the Spring XML infrastructure.
一、例如对于这样一个非顶级的嵌套自定义标签配置:
# in
'META-INF/spring.handlers'
http\://www.foo.com/schema/component=com.foo.ComponentNamespaceHandler# in
'META-INF/spring.schemas'
http\://www.foo.com/schema/component/component.xsd=com/foo/component.xsd<bean id="checkingAccountService" class="com.foo.DefaultCheckingAccountService"
jcache:cache-name="checking.account">
<!-- other dependencies here... -->
</bean>
BeanDefinition
when the 'jcache:cache-name'
attribute is parsed; this BeanDefinition
will then initialize the named JCache for us. We will also modify the existingBeanDefinition
for the 'checkingAccountService'
so that it will have a dependency on this new JCache-initializing BeanDefinition
.package com.foo;
public class JCacheInitializer {
private String name;
public JCacheInitializer(String name) {
this.name = name;
}
public void initialize() {
// lots of JCache API calls to initialize the named cache...
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://www.foo.com/schema/jcache"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.com/schema/jcache"
elementFormDefault="qualified">
<xsd:attribute name="cache-name" type="xsd:string"/>
</xsd:schema>
NamespaceHandler
.package com.foo;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class JCacheNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
super.registerBeanDefinitionDecoratorForAttribute("cache-name",
new JCacheInitializingBeanDefinitionDecorator());
}
}
BeanDefinitionDecorator
rather than a BeanDefinitionParser
.package com.foo;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class JCacheInitializingBeanDefinitionDecorator implements BeanDefinitionDecorator {
private static final String[] EMPTY_STRING_ARRAY = new String[0];
public BeanDefinitionHolder decorate(
Node source, BeanDefinitionHolder holder, ParserContext ctx) {
String initializerBeanName = registerJCacheInitializer(source, ctx);
createDependencyOnJCacheInitializer(holder, initializerBeanName);
return holder;
}
private void createDependencyOnJCacheInitializer(BeanDefinitionHolder holder, String initializerBeanName) {
AbstractBeanDefinition definition = ((AbstractBeanDefinition) holder.getBeanDefinition());
String[] dependsOn = definition.getDependsOn();
if (dependsOn == null) {
dependsOn = new String[]{initializerBeanName};
} else {
List dependencies = new ArrayList(Arrays.asList(dependsOn));
dependencies.add(initializerBeanName);
dependsOn = (String[]) dependencies.toArray(EMPTY_STRING_ARRAY);
}
definition.setDependsOn(dependsOn);
}
private String registerJCacheInitializer(Node source, ParserContext ctx) {
String cacheName = ((Attr) source).getValue();
String beanName = cacheName + "-initializer";
if (!ctx.getRegistry().containsBeanDefinition(beanName)) {
BeanDefinitionBuilder initializer = BeanDefinitionBuilder.rootBeanDefinition(JCacheInitializer.class);
initializer.addConstructorArg(cacheName);
ctx.getRegistry().registerBeanDefinition(beanName, initializer.getBeanDefinition());
}
return beanName;
}
}
# in
'META-INF/spring.handlers'
http\://www.foo.com/schema/jcache=com.foo.JCacheNamespaceHandler# in
'META-INF/spring.schemas'
http\://www.foo.com/schema/jcache/jcache.xsd=com/foo/jcache.xsd
发表评论
-
浮点数计算
2020-08-25 16:15 323@Test public void test2() ... -
AQS、ReentrantLock、CLH锁 、MCS锁 分析
2018-12-25 23:45 6781. ReentrantLock的介绍 Reentran ... -
Java并发编程:CountDownLatch、CyclicBarrier、Semaphore、Phaser
2015-02-26 16:41 1369在java 1.5中,提供了 ... -
技术网站资料
2014-07-17 11:53 0http://javakaiyuan.com ht ... -
Java之死-前言
2014-07-15 10:14 751用了好多年的java之后越来越感觉其并不像 ... -
通过JVM获取相关的服务器信息 .
2013-01-07 20:18 2169http://blog.csdn.net/zgmzyr/art ... -
Java中使用OpenSSL生成的RSA公私钥进行数据加解密
2012-10-25 11:34 4376openssl genrsa -out rsa_pr ... -
java开源
2012-05-29 14:34 1492开源不是开放编译器的源代码,而是写了一个软 ... -
用Ant打Jar包--在Manifest中引用Classpath
2012-03-15 13:20 1590用Ant打Jar包--在Manifest ... -
分布式锁服务器
2011-11-07 22:14 1948在分布式系统中如何 ... -
Java 7 Fork/Join 并行计算框架概览
2011-11-05 16:26 1072http://www.iteye.com/topic/ ... -
Apache Jakarta Commons 工具集简介
2011-11-03 11:22 1588org.apache.commons.collectio ... -
JDBC batch批处理Statement executeBatch 详解
2011-09-28 13:25 2745http://blog.csdn.net/basene ... -
代码动态生成利器ASM
2011-09-22 20:02 1055前言 代码生成器(code generato ... -
Fastjson技术内幕
2011-09-13 23:51 1341文章来源:http://code.alibabatech.co ... -
基于Spring可扩展Schema提供自定义配置支持
2011-08-07 16:01 1231在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直 ... -
alibaba fastjson(json序列化器)序列化部分源码解析
2011-08-03 21:11 2016本文copy自http://www.flydmeng.co ... -
JVM 远程调试 参数
2011-07-28 09:49 1886远程调试 参数 -server -Xdebug -Xnoag ... -
Sequential Lock in Java
2011-07-03 16:22 14021 Overview Linux内核中常见的同步机制 ... -
Hessian远程调用及序列化协议
2011-06-28 18:22 3017demo中客户端和服务端的hessian版本都是4.0.7,下 ...
相关推荐
根据提供的文档信息,本文将对"Mule 2.0用户指南"进行深入解析,并提炼出与标题、描述及部分文档内容相关的IT知识点。 ### Mule 2.0配置指南概览 #### 一、Mule 2.0简介 Mule 2.0是一款高度可扩展的企业服务总线...
- **Spring XML Configuration**:支持使用Spring的XML配置来定义Mule应用程序,简化了配置过程。 - **Configuration Builder + Mule Context Factory**:新增的配置构建器和Mule上下文工厂简化了Mule应用程序的初始...
Mule CNC 2.0 自述 Mule CNC 2.0 是一款使用 3D 打印组件构建的 CNC 铣床。 ! [Mule CNC 2.0 CAD] (/doc/Mule CNC 2.0.png) ###主要功能 3D 打印部件。包括主轴在内的主要部件均由 PLA 3D 打印。 它可以使用 3D ...
该项目将允许开发人员以与其他Spring Boot应用程序几乎相同的方式构建Mule应用程序。 Maven依赖关系: 要开始使用,只需将依赖项包含在pom文件中: <groupId>net.taptech</groupId> <artifactId>mule-spring-...
`mule-spring-configuration.dtd`和`mule-configuration.dtd`是Mule ESB的XML配置文件的DTD(文档类型定义),它们规定了XML配置文件的结构和元素。Spring是Mule ESB的核心组件之一,负责管理对象的生命周期和依赖...
【Mule与MQ集成】是关于整合Mule ESB(企业服务总线)与消息中间件,如Apache ActiveMQ的开发文档。Mule是一个开源的ESB,它提供了一个平台来连接各种应用系统,实现数据交换和服务集成。而ActiveMQ则是Apache软件...
Spring Boot模块扩展添加描述... ... ... 将此依赖项添加到您的应用程序pom.xml <groupId>...
- 这种非入侵式的方式使得现有应用程序可以无缝地与 Mule 集成,而无需对现有的代码进行大量修改。 14. **强大的应用集成框架和完整的可扩展的开发模式:** - 这些特点使得 Mule 成为了一个非常灵活且强大的工具...
MULE ESB可以与Spring框架无缝集成,利用Spring的DI特性管理服务的生命周期,同时Spring的安全、事务管理等特性也可以应用于MULE中的服务。这种集成使得开发者可以利用Spring的丰富功能,同时享受到MULE在ESB领域的...
【标题】"mule_spring_hibernate_demo"是一个基于Mule ESB(企业服务总线)、Spring框架和Hibernate ORM(对象关系映射)的实战项目,展示了如何在Mule应用程序中实现数据持久化。这个例子旨在帮助开发者理解如何将...
**完整的 Mule 2.0 配置文件示例 (Complete Mule2.0 Configuration File)** 这一部分提供了一个实际的 Mule 配置文件示例,展示了如何组合上述所有元素来构建一个完整的 Mule 应用程序。 #### 第二章:路由器及其...
尽管Mule并不依赖Java Business Integration (JBI)标准,但它通过JBI绑定支持与JBI容器(如ServiceMix)的交互,这意味着Mule组件可以与其他遵循JBI标准的组件进行通信。然而,Mule的内部API并未基于JBI标准,而是...
Mule ESB使用XML或图形化的Mule Studio进行配置。开发者可以创建数据流,定义消息如何在各个服务之间流动,包括数据转换、错误处理和流控制。Mule的工作流程通常包括消息的接收、转换、路由和发送。 **5. 安全性** ...
Mule的核心组件是UMO(Universal Message Objects,从Mule2.0开始UMO这一概念已经被组件Componse所代替),UMO实现整合逻辑。UMO可以是POJO,JavaBean等等。它支持30多种传输协议(file,FTP,UDP,TCP,email,HTTP,SOAP,JMS...
Mule ESB支持多种传输协议,如文件、FTP、UDP、TCP、SOAP、电子邮件、JMS等,并能够与Spring、ActiveMQ、CXF、Axis、Drools等流行开源项目无缝集成。此外,尽管Mule ESB并非基于JBI(Java Business Integration)...
#Convertiong EDI 到 XML 使用 smooks 和 MULE ESB Mule Demo 使用 - EDI-to-XML 项目 使用 Smooks 和 MULE ESB 将 EDI 消息转换为 XML 的演示 这个项目 持续检查应用程序的心跳 从 zip 文件夹中读取文件 解压文件 ...
在config目录下新增一个sayHello-mule-config.xml配置文件,该文件用于定义Mule项目的配置信息。该文件的内容包括Mule项目的命名空间、SchemaLocation等信息。 四、Mule项目的配置和部署 在Mule项目中,需要配置...
mule-starter-app-入门级Spring Boot Mule嵌入式应用程序内容博客请查看。用法通过Gradle git clone https://github.com/glawson6/mule-starter-app.gitcd mule-starter-app ...使用./gradlew进行./gradlew ... ./...