欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Beangle的讲解

程序员文章站 2024-01-24 11:23:04
...
Beangle 3.0.2 发布了。提供了更快的启动速度,不再修改hibernate源码,以支持命名策略问题。

主要的更改内容如下:https://github.com/beangle/library/wiki/Release-notes-3.0.0

Beangle库着眼于改善web应用开发,在众多框架中选择稳定、优秀的部分,作为最佳实践,并提供便捷的工具供使用,本身并不发明等效于其他框架的*。本次选用Spring3, Hibernate3,Struts2,Freemarker2作为web开发的基础,虽然新的框架曾出不穷,但这些框架还比较成熟和稳定。

1. Spring bean绑定改进

Beangle对spring的改善主要体现在,提供了java绑定bean的方式。样例如下:

/**
 *  建立一个模块类继承AbstractBindModule,实现其中的doBinding方法。
 */
public class DefaultModule extends AbstractBindModule {
  @Override
  protected void doBinding() {
    //1.指定名称绑定,采用bind(name,class).property的形式。以下为绑定数据源
    bind("dataSource", DriverManagerDataSource.class).property("driverClassName", "org.h2.Driver")
        .property("url", "jdbc:h2:./target/beangle;AUTO_SERVER=TRUE").property("username", "sa")
        .property("password", "");

    //2.以类名绑定多个bean,默认为singleton单例,lazy初始化模式
    //  无需指定autowire的模式,beangle根据同一类型的候选bean中,优先byName,其次byType的方式进行
    bind(HibernateModelMeta.class, ConvertPopulatorBean.class, HibernateEntityContext.class);

    //3.以类名的首字母小写作为bean的name
    bind(RailsNamingStrategy.class).shortName();

    //4.绑定properties    
    bind("hibernateConfig", PropertiesFactoryBean.class).property(
    "properties",
    props(
        "hibernate.dialect=org.hibernate.dialect.H2Dialect",
        "hibernate.cache.use_second_level_cache=true", "hibernate.cache.use_query_cache=true",
        "hibernate.query.substitutions=true 1, false 0, yes 'Y', no 'N'", "hibernate.show_sql=false"));

    //5.手工引用bean,绑定factory
    bind("sessionFactory", SessionFactoryBean.class).property("hibernateProperties", ref("hibernateConfig"))

    //6.proxy绑定
    bind("entityDao", TransactionProxyFactoryBean.class).proxy("target", HibernateEntityDao.class).parent(
    "baseTransactionProxy");
  }    
}

然后在spring的xml文件中增加如下配置:
<bean class="your.package.DefaultModule"/>

2. Hibernate 映射改进

RailsNamingStrategy 命名策略
指定RailsNamingStrategy命名策略,实现类似Rails中的表名、列名命名实现,还添加了基于包名的前缀规则。 例如在META-INF/beangle/table.properties中增加org.beangle.security=security,se_一行。即可实现所有该包下的所有类的表 映射到security用户下的,以se_开头。 采用Rails中的命名样例如下:

User --> users 类到表
User.creator --> creator_id 属性到外建
Person --> people 基于英文复数习惯的表
Person.roles --> people_resources 关联表
OverrideConfiguration 支持类重载的覆盖配置
Hibernate 在XML配置中支持单独指定entity-name,这样可以使用from entity-name这样的hql进行查询。 为了实现实体bean的可扩展性,可以在模型之间的使用接口进行依赖,例如Role的创建者creator可以使用User接口,而不是UserBean对象。 这样带来的问题是,在Role.creator的映射上,需要指定targetEntity指定为UserBean类型,这样又和UserBean耦合了。

我们的办法是在UserBean上指定entity-name为接口的名称,例如entity-name="org.beangle.security.blueprint.User" 或者使用@Entity(name="org.beangle.security.blueprint.User")注解。这样使用时不用指定targetEntity。 只不过后者hibernate支持较少,需要我们做一些改进。

如果新的NewUserBean介入系统,即可按照@Entity(name="org.beangle.security.blueprint.User")的方式,重新配置在 hibernate的cfg.xml文件中即可。OverrideConfiguration就是支持这一做法的hibernate配置子类。

新的OpenSessionInViewFilter 推迟打开Session
通过新实现的OpenSessionInViewFilter过滤器,推迟打开Session,仅在使用时打开,并占用数据库连接。可以在访问login页面、 具有缓存的页面等不是必须使用数据库的场景下,优化对连接使用。

3. Struts2 改进

SmartActionConfigBuilder 配置扫描
类似与Struts2的convention-plugin,但是不对jar包和classpath进行扫描,仅仅对spring容器的actionbean进行配置, 加快了配置的过程。同时还完整实现类似convention-plugin的做法。

全新的Tag标签
采用freemarker从新实现了一套新的标签,在开发和运行效率提升很多。例如

[@div src="user!search"/][#--即可产生一个可以容纳远程内容的div--]
[@a href="user!info?id=1" target="otherDiv"/][#--超链接跳到其他div--]
其他改进
其他struts的改进如下:

1)类似Rails,增加了Flash支持。
2)简化国际化萃取过程,支持中文国际化文件。
3)支持单例化Action
4)页面组件稳定的唯一ID产生器,而不是随机ID
5)提供了ajax后退解决办法