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文件中增加如下配置:
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后退解决办法