• beetl-spring Beetl的Spring整合扩展(1):GroupTemplateFactroyBean与Beetl Spring扩展类


    一、GroupTemplateFactroyBean与Beetl Spring扩展类

      本章主要介绍GroupTemplateFactroyBean及其相关的Beetl Spring扩展类,这些类的设计目的均为尽可能将Beetl所使用的各种组件对象(Function,ResourceLoader,TagFactory,甚至核心对象GroupTemplate等都交由Spring容器管理,以充分利用Spring的特性增强组件功能,这一思想是后面Beetl对Spring MVC及Spring Security整合的基础),除非有特殊需要,这些扩展并不要求Web环境,即使为普通的Spring应用程序的也能使用。

      文中涉及的Beetl的相关概念请阅读Beetl文档:http://ibeetl.com/guide/

    1.1 GroupTemplateFactroyBean

      GroupTemplate是Beetl的核心配置和操作类,对模板的渲染以及模板配置都是以此类为中心实现的。GroupTemplateFactoryBean是一个Spring FactoryBean<GroupTemplate>,用以在指定配置后构造GroupTemplate实例。将他配置为一个Spring Bean,如下:

    <bean name="groupTemplate" class="org.fox.beetl.ext.spring.GroupTemplateFactoryBean"/>

      GroupTemplateFactoryBean的所有配置参数都是可选的,他们可以对GroupTemplate细节提供细化的配置,具体参数格式见下表:

    参数名 参数类型
    说明
     configFileResource  Resource

    指定Beetl配置文件,这使用Spring IO包的Resource的语法来指定资源

    默认情况下加载Beetl包自带的默认配置文件:

    classpath:org/beetl/core/beetl-default.properties

     configProperties  Properties 用于覆盖上述配置文件中配置项的Properties
     resourceLoader  ResourceLoader

    Beetl组件:资源加载器,负责按照给定path加载模板数据

    默认Beetl会按照配置文件指定自己实例化资源加载器

    (Beetl默认使用ClassPathResourceLoader从classpath中获取模板)

     errorHandler  ErrorHandler

    Beetl组件:错误处理器,负责对Beetl模板渲染过程中出现的错误进行处理

    默认Beetl会按照配置文件指定自己实例化错误处理器

    (Beetl默认将错误输出到Stdout中)

     sharedVars  Map<String, Object> Beetl模板的共享变量,所有该GroupTemplate实例处理的模板都能使用该实例
     extGroupTemplateConfigs  List<ExtGroupTemplateConfig>

    GroupTemplate扩展配置类,他能对本属性以下的所有属性进行额外设置,他主要为更多配置扩展进行简化的统一配置支持

    默认不设置时,GroupTemplateFactoryBean会自动检测上下文中所有已经部署的ExtGroupTemplateConfig实现Bean进行配置。

    注意1:本属性及本属性以上的配置不能被ExtGroupTemplateConfig设置,即configFileResource、configProperties、resourceLoader、errorHandler、sharedVars、extGroupTemplateConfigs这几个属性必须在GroupTemplateFactoryBean中设置;

    注意2:配置顺序按照列表给定的顺序执行,最后是当前GroupTemplateFactoryBean的自身设置,如果配置冲突以最后配置为准。

    例如Beetl Spring Security整合扩展提供预设的整合配置文件,security-ext.3.2.xml,将扩展的tag和function都配置为一个ExtGroupTemplateFactory实例,这样使用时只需要在当前配置文件中import入预设文件,将对应的ExtGroupTemplateFactory实例就

    用法参考beetl-spring-web-security-example示例

     functions  Map<String, Function>

    Beetl组件:自定义函数

    其中key为函数名

     typeFormats  Map<Class<?>, Format>

    Beetl组件:自定义类型默认格式化器

    其中key为类型Class

     formats  Map<String, Format>

    Beetl组件:自定义格式化器

    其中key为格式化器名

     tagFactorys  Map<String, TagFactory>

    Beetl组件:自定义标签(工厂)

    其中key为标签名

     functionPackages  Map<String, Object>

    Beetl组件:自定义函数包

    其中key为函数包名

     virtualClassAttributes  Map<Class<?>, VirtualClassAttribute>

    Beetl组件:为类型添加自定义虚拟属性

    其中key为类型Class

     virtualAttributeEvals  List<VirtualAttributeEval>

    Beetl组件:虚拟属性执行器

    与virtualClassAttributes不同,他们不特定于某个类型

     1.2 SpElFunction

      SpELFunction函数类是Beetl的一个Function扩展,执行一个SpEL表达式返回其结果,调用格式为:

    Object spel(String expression)

      SpEL表达式的相关内容请参见Spring文档,它在一般EL语法上进行扩展,允许直接调用对象函数,提供对集合类的投影,筛选操作等。特殊的可以在SpEL表达式中使用@beanName的的方式直接引用到Spring上下文中的Bean,也允许使用T(className).method()调用指定类型的静态函数。例如:

    1 spel("@urlEncoder.encode(name)");
    2 spel("T(java.util.UUID).randomUUID().toString()");

      注意1:由于Beetl的限制,当前版本的SpELFunction只支持操作Beetl上下文中的共享变量和全局变量,并不支持;

      注意2:SpELFunction必须作为Spring上下文中的受管Bean通过GroupTemplateFactoryBean提供给Beetl使用。

    1.3 SpringServletContextResourceLoader

      SpringServletContextResourceLoader使用Spring的机制获取Web环境中的ServletContext,以servletContext.getRealPath("/")获取到的文件路径为资源的根目录。这个ResourceLoader用以在Spring Web环境下替换Beetl自带的WebAppResourceLoader,以解决Beetl的jar包不在WEB-INF/lib下造成错误判定WebRoot目录的问题(例如main方法启动的Jetty服务)。

      注意1:与一般基于File的FileResourceLoader相同,他支持设置charset和autoCheck属性,但它不支持设置root属性(只能通过beetl配置文件REOURCE.root设置)。

      注意2:SpringServletContextResourceLoader必须作为Spring上下文中的受管Bean通过GroupTemplateFactoryBean提供给Beetl使用。

    1.4 SpringBeanTagFactory

      SpringBeanTagFactory作为一个TagFactory实现,他按照name参数的设置,从Spring上下文中获取指定name的Tag实现Bean实例返回。SpringBeanTagFactory必须作为Spring上下文中的受管Bean通过GroupTemplateFactoryBean提供给Beetl使用。并且应该保证他所引用的Tag实现Bean必须是prototype的,不能单例,否则在使用时会出现不一致的情况。

     1 <bean name="groupTemplate" ....>
     2   <property name="tagFactorys">
     3     <map>
     4       <entry key="sec.accessIf" value-ref="accessIfTagFactory"/>
     5     </map> 
     6   </property>
     7 </bean>
     8 <bean name="accessIfTagFactory" class="org.fox.beetl.ext.spring.tag.SpringBeanTagFactory">
     9     <property name="name" value="accessIfTag"/>
    10 </bean>
    11 <bean name="accessIfTag" class="...." scope="prototype"/>

      截至Beetl2.0.10,SpringBeanTagFactory的使用有一些特殊问题,需要一些特殊处理技巧,详细问题描述和处理技巧参见这里:http://www.cnblogs.com/shishuifox/p/3852398.html  使用方法建议参考示例beetl-spring-web-security-example

      简单的说,要正常使用SpringBeanTagFactory,需要保证1. 将他定义为一个公开的有确认名字的bean,不能使用匿名bean或内部bean定义。2.在应用程序上下文中注册一个ApplicationContext生命周期监听器:

    <bean class="org.fox.beetl.ext.spring.utils.ApplicationContextLifecycleEventListener"/>

      Beetl2.0.11已经修正该问题,该限制也于beetl-spring.1.0.4取消,建议升级。

  • 相关阅读:
    abp 框架定时任务(一)
    jenkins构建maven项目:找不到本地依赖包的解决办法
    python异常处理及常用异常
    python中unittest常用断言
    python自动化中遇到问题--Assert断言失败了,但是在异常捕获了,生成测试报告却是pass的。
    python+unittest框架
    linux虚拟机内网突然不通了
    curl 命令-接口测试
    python中使用os.path.join()
    ActiveMQ消费重试机制
  • 原文地址:https://www.cnblogs.com/shishuifox/p/3852298.html
Copyright © 2020-2023  润新知