`
mozhenghua
  • 浏览: 324603 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring自定义标签实现 之一对多实体解析

阅读更多

       通过上一篇博客(http://mozhenghua.iteye.com/blog/1830842),我们了解到了如何通过spring来解析如下,只有一个子标签(一对一实体关系)的需求

 

<tsearcher:parent id="testparent">  
        <tsearcher:child name="alex" age="12"/>
</tsearcher:parent> 

 

    那么如果子标签如果有n个(上不封顶)的话(一对多实体关系)有应该如何解析呢?标签如下:

    <tsearcher:parent id="testparent">  
        <tsearcher:child name="alex" age="12"/>
        <tsearcher:child name="joe" age="11"/>
        <tsearcher:child name="kid"  age="13"/>  
    </tsearcher:parent>  

 

首先,创建Parent和Child类,给标签映射时使用。

   

public class Child {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Child() {
		super();
	}
}

 

public class Parent {
	private Map<String,Child> child;
	public Map<String, Child> getChild() {
		return child;
	}
	public void setChild(Map<String, Child> child) {
		this.child = child;
	}
}

 

 Parent中的属性是Map<String,Child>类型的,key是Child的name,value就是Child类型。

以下就是解析Parent标签的解析器代码:

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class ParentParser extends AbstractSimpleBeanDefinitionParser {
	protected void doParse(Element element, ParserContext parserContext,
			BeanDefinitionBuilder builder) {
		try {
			builder.addPropertyValue("child", parseMapElement(element,
					parserContext, builder));
		} catch (Exception e) {
			parserContext.getReaderContext()
					.error(
							"class " + Parent.class.getName()
									+ " can not be create", element, e);
		}
	}

	@SuppressWarnings("all")
	public Map parseMapElement(Element mapEle, 
			ParserContext parserContext, BeanDefinitionBuilder builder) {

		List entryEles = DomUtils.getChildElementsByTagName(mapEle, "child");
                // 关键是以下这个ManagedMap类型,充当着一个map类型的beandefinition类型的说明对象
		ManagedMap map = new ManagedMap(entryEles.size());
		map.setMergeEnabled(true);
		map.setSource(parserContext.getReaderContext().extractSource(mapEle));

		for (Iterator it = entryEles.iterator(); it.hasNext();) {
			Element entryEle = (Element) it.next();
	
			String name = entryEle.getAttribute("name");

			map.put(key, parserContext.getDelegate().parseCustomElement(
					entryEle, builder.getRawBeanDefinition()));

		}

		return map;
	}

	@Override
	protected Class<Parent> getBeanClass(Element element) {
		return Parent.class;
	}

}

 以下就是解析Child的解析器:

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

public class ChildParser extends AbstractSimpleBeanDefinitionParser {

	@Override
	protected void doParse(Element element, ParserContext parserContext,
			BeanDefinitionBuilder builder) {

		super.doParse(element, parserContext, builder);

		builder.addPropertyValue("name", element.getAttribute("name"));
		builder.addPropertyValue("age", Integer.parseInt(element
				.getAttribute("age")));
	}

	@Override
	protected Class<Child> getBeanClass(Element element) {
		return Child.class;
	}

}

 以上只给出parent和client类的相关代码,如果要了解如何将这些类是怎么配置的,请查阅上一篇博客(http://mozhenghua.iteye.com/blog/1830842

分享到:
评论

相关推荐

    Spring 自定义注解的解析

    总的来说,Spring自定义注解的解析是一个强大且灵活的工具,可以帮助我们实现更精细化的代码组织和控制。结合`@ComponentScan`,我们可以轻松地在Spring环境中管理和利用自定义注解,进一步提升代码的可读性和可维护...

    实现生成自定义注解的实体类

    本篇文章将详细探讨如何实现生成自定义注解的实体类,以及它们在实际开发中的应用。 一、自定义注解的定义 自定义注解的定义类似于接口,但以`@interface`关键字开头。下面是一个简单的自定义注解示例: ```java @...

    Spring源代码解析(八):Spring驱动Hibernate的实现.doc

    总的来说,Spring通过`LocalSessionFactoryBean`实现对Hibernate的驱动,它将数据源、事务管理和配置信息集成在一起,创建出适应Spring管理的`SessionFactory`。这种集成方式使得开发者无需过多关注底层细节,可以...

    SpringData如何实现查询的代码

    在这个例子中,`JpaRepository`提供了基本的CRUD操作,而`findByUsername`方法是自定义的查询方法,SpringData会自动解析其名称并生成对应的SQL(对于JPA)或其他查询语言(对于其他数据存储)。这种方法的优点在于...

    spring+spring mvc+mybatis框架整合实现超市货物管理系统

    总的来说,"spring+spring mvc+mybatis框架整合实现超市货物管理系统"是一个涵盖后端开发基础技能的项目,涉及了JavaEE的多个层面,从Web层的路由处理,到业务逻辑的实现,再到数据库操作,以及用户认证和分页显示等...

    Spring Data JPA Spring Data Commons

    Spring Data JPA是Spring框架的一部分,它是一种简便的数据访问层(Repository)的...通过深入了解和掌握Spring Data JPA,开发者可以更加便捷地实现对数据库的操作,并在项目中快速地构建出稳定可靠的数据持久化层。

    Spring Data JPA从入门到精通

    《Spring Data JPA从入门到精通》是一本深入解析Spring Data JPA的书籍,它以Spring Boot框架为核心,旨在帮助读者全面理解并熟练运用Spring Data JPA进行数据库操作。Spring Data JPA是Spring Framework的一个模块...

    Spring源代码解析(九):Spring_Acegi框架鉴权的实现.doc

    在Spring框架中,Acegi(现在已经演变为Spring Security)是一个强大的安全管理组件,它提供了认证、授权等核心安全功能。在Spring_Acegi框架鉴权的实现中,我们主要关注的是如何处理用户的登录验证以及在验证成功或...

    Ext+Spring+Hibernate(原创送给javaeye朋友)

    标题 "Ext+Spring+Hibernate(原创送给javaeye朋友)" 暗示了这是一个关于整合Java技术栈的教程或示例项目,其中涉及了三个关键组件:Ext(ExtJS)、Spring和Hibernate。这些技术在企业级Java开发中广泛使用,分别用于...

    springjpa 和 spring多视图配置实例

    在IT行业中,Spring...通过这个实例,你可以学习到如何在Spring环境中集成多个组件,构建一个完整的Web应用,同时理解和实践MVC模式、ORM持久化、模板引擎以及JSON数据交换。这将对你的Java Web开发技能有显著提升。

    Spring-data-jpa常用教程.pdf

    JPA 作为 Java 平台的一种标准,旨在为 Java 应用程序提供一种通用的对象关系映射 (ORM) 解决方案,以减少对 SQL 查询语言的依赖。虽然 JPA 提供了一个强大的 ORM 框架标准,但实际的实现通常由像 Hibernate 这样的...

    JAVA论坛系统源码(Struts 2+Hibernate+Spring实现)

    Java论坛系统源码是基于三大...综上所述,这个Java论坛系统源码是一份宝贵的教育资源,它不仅展现了Struts 2、Hibernate和Spring的集成使用,还提供了实践这些技术的实例,有助于加深对Java Web开发的理解和技能提升。

    spring-roo-docs

    - 设置实体之间的关系:例如一对多或多对多的关系。 - 自动生成CRUD操作:SpringRoo会自动为实体类生成基本的增删改查方法。 **2.6 第三步:集成测试** 集成测试阶段包括: - 编写测试用例:针对实体类的方法编写...

    springBoot整合springData JPA

    这通常通过继承JpaRepository接口,然后定义一个返回多个实体类型的查询方法来实现。 3. **动态SQL**:Spring Data JPA提供了Criteria API,可以构建复杂的动态查询。Criteria API允许我们在运行时动态地构造查询,...

    mybatis-plus自定义模板.zip

    Mybatis-Plus是一款基于Mybatis和Spring Boot的轻量级扩展框架,它简化了对数据库的基本操作,如CRUD(创建、读取、更新、删除)等。在默认情况下,Mybatis-Plus提供了丰富的代码生成器,可以帮助开发者快速生成实体...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    通过Spring Data JPA,我们可以直接通过接口定义来实现对数据库的CRUD操作,无需编写大量的DAO层代码。只需提供一个继承自JpaRepository的接口,即可自动实现基本的查询方法。此外,Spring Data JPA还支持自定义查询...

    Spring Data JPA.zip

    在黑马程序员的 JavaEE 57期课程中,学员们不仅会学习这些基础知识,还会通过实际项目来加深对 Spring Data JPA 的理解和应用,包括如何在多表关联、事务处理、数据验证等方面进行实战操作。掌握 Spring Data JPA ...

    精通Spring_Web_MVC优秀框架.pdf

    - **理解DispatcherServlet**:DispatcherServlet是Spring Web MVC的核心组件之一,负责初始化Web应用环境,解析请求并转发给相应的控制器。 - **注解式控制器开发详解**:Spring Web MVC支持注解式的开发方式,通过...

    SpringMVC+Spring+Spring-Data-JPA整合-完整Demo

    Spring还包含了对事务管理、数据访问、Web应用、远程服务等多种功能的支持,为开发者提供了一站式的解决方案。 **3. Spring Data JPA** Spring Data JPA是Spring框架的一个模块,它简化了Java Persistence API(JPA...

    Spring Data JPA入门项目02

    4. 嵌套查询和关联:Spring Data JPA支持一对多、一对一、多对多等各种关联关系。在查询时,可以使用`@OneToMany`, `@ManyToOne`, `@OneToOne`或`@ManyToMany`注解来处理关联的对象。例如,`findAllWithUsers()`方法...

Global site tag (gtag.js) - Google Analytics