通过上一篇博客(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自定义注解的解析是一个强大且灵活的工具,可以帮助我们实现更精细化的代码组织和控制。结合`@ComponentScan`,我们可以轻松地在Spring环境中管理和利用自定义注解,进一步提升代码的可读性和可维护...
本篇文章将详细探讨如何实现生成自定义注解的实体类,以及它们在实际开发中的应用。 一、自定义注解的定义 自定义注解的定义类似于接口,但以`@interface`关键字开头。下面是一个简单的自定义注解示例: ```java @...
总的来说,Spring通过`LocalSessionFactoryBean`实现对Hibernate的驱动,它将数据源、事务管理和配置信息集成在一起,创建出适应Spring管理的`SessionFactory`。这种集成方式使得开发者无需过多关注底层细节,可以...
在这个例子中,`JpaRepository`提供了基本的CRUD操作,而`findByUsername`方法是自定义的查询方法,SpringData会自动解析其名称并生成对应的SQL(对于JPA)或其他查询语言(对于其他数据存储)。这种方法的优点在于...
总的来说,"spring+spring mvc+mybatis框架整合实现超市货物管理系统"是一个涵盖后端开发基础技能的项目,涉及了JavaEE的多个层面,从Web层的路由处理,到业务逻辑的实现,再到数据库操作,以及用户认证和分页显示等...
Spring Data JPA是Spring框架的一部分,它是一种简便的数据访问层(Repository)的...通过深入了解和掌握Spring Data JPA,开发者可以更加便捷地实现对数据库的操作,并在项目中快速地构建出稳定可靠的数据持久化层。
《Spring Data JPA从入门到精通》是一本深入解析Spring Data JPA的书籍,它以Spring Boot框架为核心,旨在帮助读者全面理解并熟练运用Spring Data JPA进行数据库操作。Spring Data JPA是Spring Framework的一个模块...
在Spring框架中,Acegi(现在已经演变为Spring Security)是一个强大的安全管理组件,它提供了认证、授权等核心安全功能。在Spring_Acegi框架鉴权的实现中,我们主要关注的是如何处理用户的登录验证以及在验证成功或...
标题 "Ext+Spring+Hibernate(原创送给javaeye朋友)" 暗示了这是一个关于整合Java技术栈的教程或示例项目,其中涉及了三个关键组件:Ext(ExtJS)、Spring和Hibernate。这些技术在企业级Java开发中广泛使用,分别用于...
在IT行业中,Spring...通过这个实例,你可以学习到如何在Spring环境中集成多个组件,构建一个完整的Web应用,同时理解和实践MVC模式、ORM持久化、模板引擎以及JSON数据交换。这将对你的Java Web开发技能有显著提升。
JPA 作为 Java 平台的一种标准,旨在为 Java 应用程序提供一种通用的对象关系映射 (ORM) 解决方案,以减少对 SQL 查询语言的依赖。虽然 JPA 提供了一个强大的 ORM 框架标准,但实际的实现通常由像 Hibernate 这样的...
Java论坛系统源码是基于三大...综上所述,这个Java论坛系统源码是一份宝贵的教育资源,它不仅展现了Struts 2、Hibernate和Spring的集成使用,还提供了实践这些技术的实例,有助于加深对Java Web开发的理解和技能提升。
- 设置实体之间的关系:例如一对多或多对多的关系。 - 自动生成CRUD操作:SpringRoo会自动为实体类生成基本的增删改查方法。 **2.6 第三步:集成测试** 集成测试阶段包括: - 编写测试用例:针对实体类的方法编写...
这通常通过继承JpaRepository接口,然后定义一个返回多个实体类型的查询方法来实现。 3. **动态SQL**:Spring Data JPA提供了Criteria API,可以构建复杂的动态查询。Criteria API允许我们在运行时动态地构造查询,...
Mybatis-Plus是一款基于Mybatis和Spring Boot的轻量级扩展框架,它简化了对数据库的基本操作,如CRUD(创建、读取、更新、删除)等。在默认情况下,Mybatis-Plus提供了丰富的代码生成器,可以帮助开发者快速生成实体...
通过Spring Data JPA,我们可以直接通过接口定义来实现对数据库的CRUD操作,无需编写大量的DAO层代码。只需提供一个继承自JpaRepository的接口,即可自动实现基本的查询方法。此外,Spring Data JPA还支持自定义查询...
在黑马程序员的 JavaEE 57期课程中,学员们不仅会学习这些基础知识,还会通过实际项目来加深对 Spring Data JPA 的理解和应用,包括如何在多表关联、事务处理、数据验证等方面进行实战操作。掌握 Spring Data JPA ...
- **理解DispatcherServlet**:DispatcherServlet是Spring Web MVC的核心组件之一,负责初始化Web应用环境,解析请求并转发给相应的控制器。 - **注解式控制器开发详解**:Spring Web MVC支持注解式的开发方式,通过...
Spring还包含了对事务管理、数据访问、Web应用、远程服务等多种功能的支持,为开发者提供了一站式的解决方案。 **3. Spring Data JPA** Spring Data JPA是Spring框架的一个模块,它简化了Java Persistence API(JPA...
4. 嵌套查询和关联:Spring Data JPA支持一对多、一对一、多对多等各种关联关系。在查询时,可以使用`@OneToMany`, `@ManyToOne`, `@OneToOne`或`@ManyToMany`注解来处理关联的对象。例如,`findAllWithUsers()`方法...