jBeanBox 4.0.0 发布,微形 Java IOC/AOP 工具

yong9981
 yong9981
发布于 2020年02月15日
收藏 7

jBeanBox是一个微形但功能较齐全的IOC/AOP工具,它本身的核心源码只有约3000行,jBeanBox兼容主要的JSR330和Spring注解。jBeanBox适用于小型项目做为Spring的替代品,或充当开源项目的IOC/AOP功能模块。jBeanBox用于Java6及以上环境,主页:https://gitee.com/drinkjava2/jBeanBox


下表是jBeanBox与Spring、Guice在功能上的一个对比表,红字部分为本次更新新增的内容:  

4.0.0版更新明细:  
1. 添加了@NAMED和@QUALIFER两个注解,并相应地增加了对应的Spring的@Qualifer和JSR330的@Named、@Qualifer注解的兼容性支持。  
 具体用法请参见JSR330标准或Spring关于@Named和@Qualifer的用法,唯一的区别只是jBeanBox自带的注解都是大写的,当然,也可以直接使用JSR或Spring注解,jBeanBox已经把这些注解都打包进来了,无须引入Spring或JSR库。 Java的类加载器有先到先得的特性,如果jar没有特殊设定,当一个类被先加载,后面出现的同名类将被忽略,这是为什么jBeanBox能兼容Spring注解的原理。  

2. 新增@COMPONENT注解,并相应增加了对应的Spring的@Service,@Component,@Controller,@Repository四个注解的兼容性支持。  
具体用法请参见Spring对上述四个注解的用法,而且必须结合jBeanBox的scanComponents方法来进行类扫描,这个和Spring的类扫描是一样的,光在类上加一个@Component注解是不够的,还必须开启扫描,好发现哪些类属于需要容器生成的。注意Guice是没有这个类扫描功能的,功能缺失。 
类扫描的一个示例子如下,以包名为参数,可以有多个包名用逗号隔开,但每个包名只允许出现一个星号通配符:
JBEANBOX.scanComponents("com.foo.*", "com.bar.*", "com.*.baz");

3. 新增一个PrototypeBean接口
   通常如果一个类,没有任何配置、注解,则使用jBeanBox获取它的实例JBEANBOX.getBean(Foo.Class)将会是一个单例,但是如果这个类实现了PrototypeBean接口,jBeanBox将会每次都创建一个新的实例。这个功能通常可以用在Controller上,如果让Controller由jBeanBox生成,它可以强制每次生成一个新实例而不是返回一个单例。

4.其它一些其它细小更新
  增加Spring的@Value支持、AOP匹配允许有多个规则用逗号隔开、create方法取消Caller参数等。具体使用请参见主页说明。

另外说一下,本次更新jBeanBox新增了@Named和@Qualifier注解的支持,但目的仅仅是为了更符合标准和可移植性,照顾现有Guice和Spring用户习惯。但我本人不建议使用@Named和@Qualifier这两个注解,因为在jBeanBox中有更优雅的实现方式,见下:

//数据池配置基类
public static class HikariCPBox extends BeanBox {
   public HikariDataSource create() {
       HikariDataSource ds = new HikariDataSource();
       ds.addDataSourceProperty("cachePrepStmts", true);
       ds.addDataSourceProperty("prepStmtCacheSize", 250);
       ds.setMaximumPoolSize(3);
       ds.setConnectionTimeout(5000);
       this.setPreDestroy("close");// jBeanBox will close pool
       return ds;
   }
}

//oracle数据池配置,继承于HikariCPBox
public static class OracleDataSourceBox extends HikariCPBox {
   {
      injectValue("jdbcUrl", "jdbc:oracle:thin:@127.0.0.1:1521:XE");
      injectValue("driverClassName", "oracle.jdbc.OracleDriver");
      injectValue("username", "root");// change to your user & password
      injectValue("password", "root888");
   }
}

//MySql数据源配置类, 继承了用户名和密码,重载了jdbcRul和driverClassName
public static class MySqlDataSourceBox extends OracleDataSourceBox {
   {
       injectValue("jdbcUrl",
           "jdbc:mysql://127.0.0.1:3306/jsqlboxtest?rewriteBatchedStatements=true&useSSL=false");
       injectValue("driverClassName", "com.mysql.jdbc.Driver");
   }
}

//Service类,有两个DataSource字段需要注入
public class SomeService{
@INJECT(MySqlDataSourceBox.class)
DataSource ds1;

@INJECT(OracleDataSourceBox.class)
DataSource ds2;
...
}

大家可以看到,使用jBeanBox可以直接在@INJECT里写上配置类就完了,简单明了。而使用@Named或@Qualifier不光开发麻烦,而且还不支持IDE定位到配置类,维护也麻烦。如果有不相信的,可以把上例用Guice或Spring写一遍作对比就知道了。  

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:jBeanBox 4.0.0 发布,微形 Java IOC/AOP 工具
加载中

最新评论(9

开源老码农
开源老码农
如果数据池配置采用的是 properties 文件, 应该如何注入 DataSource 呢?
yong9981
yong9981
同Spring的java配置一样,默认create方法只会调用一次,在create方法里只要拿到了数据池实例,就会被管理成单例。
另外即然数据池只支持properties 配置,说明这个数据池自已已经把自已的路堵死了,如果要生成多个实例怎么办?程序里要动态生成数据池怎么办?给这个数据池作者提个issue吧。
开源老码农
开源老码农
数据池当然可以 "不只" 支持 properties 配置, 问题的关键是应用明明可以简单地用 properties 来配置, 为什么需要写若干 BeanBox 的继承类呢? 不用拿动态生成数据池来讲话, 很少有应用有这种需求. 这个截图显示了如何使用 @Named 来做工作的 : https://oscimg.oschina.net/oscnet/up-0c7d42987aed59d9754e63cd3d71c92a562.png
yong9981
yong9981
噢你的问题实际上是:IOC工具读取配置文本并创建Bean,这个jBeanBox默认不提供,我在主页上只是提了一下可以用setValueTranslator(ValueTranslator) 方法可设置一个@VALUE的解释器,由用户自已编写从配置文件读取并转换为文本或其它对象,这是程序员的基本功,因为太简单,所以反而没提供很周全的实现,待下个版本吧。
@Named的问题是不支持IDE定位,你的IOC用法的例子过于简化,配置继承的演示、数据池属性设定、preDestroy设定都省略了,而且还是用插件来实现数据池配置,所以看起来很简洁。但是一旦离开ACT环境这个专有环境就跑不通了。而且它不支持IDE定位和重构的问题依然存在。你用Ctrl+鼠标右键在"db1"上点一下,看看它能不能跳到配置文件的相应行上去?
动态数据源在单元测试时是可能用到的。继承是演示用的,因为IOC工具的主要功能就是Bean的搭配,配置的继承(重用)是一个很重要的功能点,实际上jSqlBox的数据源配置就用到了继承,并不是人为造出这个需求。
大猫猫233
大猫猫233
为啥要重复造轮子呢。
江柯
江柯
为了以不同的角度探索新的功能
yong9981
yong9981
我有一个ORM工具需要随库提供一个IOC/AOP工具,类似的工具项目有Actframework、Nutz、jFinal等,他们都自带了IOC/AOP功能而没有采用Spring的。从我的角度看,重复造轮子的理由:
1.Spring太大,更新太频,无法掌控 2.Guice等小型工具功能有缺陷 3.@Named和@Qualifer注解不如jBeanBox的解决方式。
开源老码农
开源老码农
这里有两篇和 yong9981 一起关于 IOC/AOP 方面讨论的博客: https://my.oschina.net/greenlaw110/blog/3147470, https://my.oschina.net/greenlaw110/blog/3135822
yong9981
yong9981
写错一处,自已更正一下:JBEANBOX.scanComponents()参数中的包名不能有星号通配符,所以应该是:JBEANBOX.scanComponents("com.foo", "com.bar", "com.baz");这样的形式。通配符是AOP规则中的,不小心搞混了。
返回顶部
顶部