Spring的可扩展点做得比hibernate好多了,参考文档上就可以找到扩展spring配置文件的方法。利用在类路径的META-INF目录下加入spring.handlers和spring.schemas两个文件来作为扩展的入口。
我的思路是这样的,通过在一个spring总的配置文件中,比如applicationContext.xml中,加入一段我自定义的xml标签,在这个标签上定义我需要注册的spring的service bean在什么类路径下。然后spring在启动时,读取到该标签上定义的类路径,寻找该类路径下被我用annotation标注过的类,将该类注册到spring容器中。
第一步,定义标识service bean的annotation:
该annotation其实只需要一个属性,该service bean注册到spring中的id,所以我建立了如下的名字叫Bean的annotation类:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
//获取bean id
String id();
}
该annotation只能定义在类或者接口上,只有一个属性id,必填。用它标识后的service bean如下:
@Bean(id="sample.lesson.student")
public class StudentServiceBean implements IStudent {
第二步,扩展spring xml配置,定义service bean所在的目录:
前面已经说过,我们需要在applicationContext.xml这个总配置文件中定义service bean所在的目录。于是我在applicationContext.xml加入如下的tag:
<sa:annotation-autoload >
<sa:package>sample/service/lesson </sa:package>
<sa:package>sample/service/student</sa:package>
</sa:annotation-autoload>
加完后,eclipse的schemas校验功能已经告诉我们,出错误了。因为spring中并没有sa:annotation-autolaod和sa:package这样的标签,所以我们需要扩展spring校验用的schemas。扩展的方法就是在applicationContext文件中的beans根节点加入对schemas定义的代码:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:sa="http://leeon.iteye.com/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://leeon.iteye.com/context http://leeon.iteye.com/context.xsd">
这段代码中,xmns:sa=http://leeon.iteye.com/context定义了xml tag的前缀是sa,而xsi:chemaLocation中定义的 http://leeon.iteye.com/context http://leeon.iteye.com/context.xsd指向了schemas xsd文件的位置。当然,不能让系统真的访问互联网去下载这个xsd了,可以通过在META-INF中创建的spring.handlers和spring.schemas文件类来定义schemas在本地类路径中的位置以及相关的handle这个schemas定义的xml tag的解析类,Spring加载时会通过这两个文件找到xsd和handler解析类的本地版本。
第三步,建立spring.handlers和spring.schemas以及相关的xsd和handler
于是在/META-INF中创建spring.schemas,内容如下:http\://leeon.iteye.com/context.xsd=leeon/extend/spring/context.xsd
这句话说明了真正校验我们自定义tag的xsd在leeon/extend/spring的类路径下
说明了位置后,我们就可以创建context.xsd,该xsd就是普通的校验xml用的xsd,不多做描述。可以参考以下代码:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://leeon.iteye.com/context" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://leeon.iteye.com/context" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:annotation>
<xsd:documentation>
<![CDATA[
XML Schema for the Spring-Annotation module, it enables the use of annotations to configure your Spring-Framework application
]]>
</xsd:documentation>
</xsd:annotation>
<xsd:element name="annotation-autoload">
<xsd:annotation>
<xsd:documentation>
<![CDATA[Enables the scanning of anotated classes in the classpath, the scanDirs attribute tells to scan all open directories in the classpath, and the jarMarkerFile enables you to tell the scanner to loog for a file named different from to.properties in the jar files.]]>
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="package" type="xsd:string" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
<![CDATA[defines that the scanner will only include files that match with this.]]>
</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="pattern" type="xsd:string" default=".*\.class" use="optional" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
接下来创建spring.handlers,内容如下:http\://leeon.iteye.com/context=leeon.extend.spring.EnableAnnotationHandler,这句话说明了Handler处理类所在的类路径,是真正处理我们在xml定义的tag的handler类。
创建时必须继承org.springframework.beans.factory.xml.NamespaceHandlerSupport类。该类是一个抽象类,必须实现的方式就是init,在这个方法中,告诉spring容器,处理哪些tag,需要哪些BeanDefinitionParser,代码如下:
public class EnableAnnotationHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("annotation-autoload",
new AnnotationAutoloadBeanDefinitionParser());
}
}
这里就是告诉spring容器,初始化处理annotation-autoload这个的xml element时,使用AnnotationAutoloadBeanDefinitionParser,该Parser是一个实现了BeanDefinitionParser接口的类。
第四步,实现自定义的BeanDefinitionParser
BeanDefinitionParser接口中,必须实现的方法是parse方法。顾名思义,我们要在这个方法中解析自定义的xml element,然后拿到在xml定义的service bean所在的类路径,再将该路径下被@Bean注册过的类,注册到spring的容器中。
public BeanDefinition parse(Element element, ParserContext parserContext) {
}
Parse的两个参数:
1. Element表示需要被我们解析的自定义的xml element对应的对象,这里对应的就是<sa:annotation-autoload>节点及其子节点。通过该对象我们可以获取我们配置的类路径,并搜索类路径,找到需要注册到spring容器中的类以及注册后的id。
2. ParserContext,BeanDefinitionParser的相关上下文环境,我们可以从这个参数中去到spring的类注册器,并进行spring bean的注册:
//从parserContext中获取bean注册器
BeanDefinitionRegistry bdr = parserContext.getRegistry();
//从创建一个spring bean的定义,并设定一下初始化值
//setBeanClass就是设定符合条件的service bean对应的class
final RootBeanDefinition rbd = new RootBeanDefinition();
rbd.setAbstract(false);
rbd.setBeanClass(c);
rbd.setSingleton(false);
rbd.setLazyInit(false);
//将spring bean的定义,通过id,注册到spring容器中
//这里的id就是从annotation中去到的service bean对应的spring bean id
bdr.registerBeanDefinition(id, rbd);
另外,该方法虽然需要返回值,但也是可以返回null的。定义好这个AnnotationAutoloadBeanDefinitionParser后,将spring bean注册的xml代码移植到annotation上就大功告成。当spring启动解析到<sa:annotation-autoload>标签时,就会将处理的过程交给AnnotationAutoloadBeanDefinitionParser,有Parser里的parse方法来解析到service bean所在路径,搜索,获取id和class,最后加载完成。
分享到:
相关推荐
压缩包"ssh_jar"很可能包含了经过精简后的SSH框架各个组成部分的jar文件,每个文件可能已经去除了冗余或未使用的类和方法。在使用这个精简版的SSH框架时,开发者需要确保所有必要的功能都已包含,并且在遇到新的功能...
在实际开发中,SSH框架结合CRM理念,能够为企业打造一个高效、灵活且易于维护的客户关系管理系统。开发过程中,还需要考虑安全性、性能优化、数据库设计以及用户体验等多个方面,确保系统的稳定性和实用性。同时,...
【标题】"JAVA源码 jsp源代码程序 代码 SSH框架 easyui 进销存管理系统"揭示了这个项目的...通过分析和学习这个项目的源代码,开发者不仅可以提升对SSH框架的理解,也能掌握如何利用EasyUI来打造高效的后台管理系统。
SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中的经典组合,常用于构建企业级应用。本文将详细讲解如何在Myeclipse 6.0环境下配置SSH框架。 首先,我们需要创建一个新的WEB工程。在Myeclipse中,选择...
Struts2的核心组件包括拦截器(Interceptor)、配置文件(struts.xml)以及一系列插件,这些使得开发者能够灵活控制请求流程,并实现了AOP(面向切面编程)的概念。 Spring框架则是一个全面的企业级应用框架,它...
#### SSH框架集成:打造高效企业级应用 SSH框架的集成为企业级应用开发带来了极大的便利。它们各自扮演着不同的角色,共同构建了一个功能强大、结构清晰的应用系统: 1. **视图层**:Struts负责前端界面的展示,...
通过分析这个项目的源代码,新手可以深入理解SSH框架如何协同工作,以及如何利用Bootstrap来打造现代Web应用。这样的实践项目对于巩固理论知识、提升实际操作技能有着显著的作用,同时也适合作为参与Web开发比赛的...
在本项目中,我们主要探讨的是...通过理解和实践这样的项目,开发者可以深入理解SSH2框架的使用,以及如何结合Ztree和Bootstrap来打造用户友好的界面。同时,对于Oracle数据库的使用和管理也是提升数据库技能的好机会。
SSH框架,全称为Struts2、Hibernate和Spring,是Java Web开发中的一种经典组合,用于构建企业级应用程序。...通过不断学习和实践,开发者可以熟练掌握SSH框架,提高开发效率,打造出高效、稳定的Web应用程序。
**SSH2 框架与 Maven 的整合应用** 在软件开发领域,SSH2(Struts2、Spring 和 Hibernate 2)是一种经典的Java企业级应用程序开发框架组合,它为开发者提供了强大的MVC(Model-View-Controller)架构支持、依赖注入...
通过SSH框架,我们可以快速搭建出一个稳定、高效的博客系统,不仅满足基本的博客功能,还能通过扩展实现更多个性化需求。在实践中,开发者还需要考虑安全性、性能优化、用户体验等方面的问题,以打造更高质量的应用...
SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架。本章节将详细介绍如何在...通过不断的实践和优化,开发者可以更好地利用SSH框架解决实际问题,打造出高质量的Web应用。
SSH框架整合是Java Web开发中常见的一种技术组合,它涵盖了Spring、Struts2和Hibernate这三个主要的开源框架。这些框架分别负责控制层、业务层和数据访问层的管理,为开发者提供了一种高效且可维护的开发模式。下面...
需要注意的是,尽管SSH提供了强大的功能,但其配置较为复杂,尤其是当项目规模增大时,大量的XML配置文件可能导致维护困难。因此,SSH框架的注解实现应运而生,它简化了配置,提高了开发效率,并使代码更加清晰。...
首先,让我们逐一了解SSH框架的核心组件: 1. **Struts**:这是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,主要负责处理HTTP请求,控制应用程序的流程。在超市管理系统中,Struts处理用户从POS机...
SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架组合,用于构建高效、可维护的Web应用程序。...通过深入理解每个框架的注解用法,可以更好地驾驭SSH框架,打造高效稳定的Web应用。
5. **测试与调试**:编写JUnit测试用例,验证SSH框架的整合是否成功。通过Eclipse的调试功能,可以方便地跟踪代码执行过程,找出可能存在的问题。 6. **优化与扩展**:在实际项目中,我们还需要考虑性能优化,比如...
SSH框架的整合,使得开发人员能够更高效地构建可扩展且易于维护的Web应用。 ### Struts2:控制层 Struts2作为MVC架构中的控制层,负责接收HTTP请求,解析请求参数,调用业务逻辑,并将处理结果转发到相应的视图...
SSH开发电影管理系统是一种基于Java技术的Web应用框架组合,由Struts2、Spring和Hibernate三个开源框架集成。这个系统主要用于实现在线影院的功能,允许用户在线浏览、搜索和观看电影,同时还可能包括用户管理、评论...
在这个项目中,我们将深入探讨SSH框架在构建BBS论坛系统中的应用。 1. **Spring框架**:Spring是核心的依赖注入(DI)和面向切面编程(AOP)框架,它简化了Java企业级应用的开发。在BBS论坛系统中,Spring可以管理...