宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2020-03-07

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


下表是jBeanBox与Spring、Guice在功能上的一个对比表,红字部分为本次更新新增的内容:  
jBeanBox 4.0.0 发布,微形 Java IOC/AOP 工具

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写一遍作对比就知道了。  

更多资讯
游戏推荐
更多+