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

←手機掃碼閱讀     admin @ 2020-02-15 , reply:0

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





[admin ]

來源:OsChina
連結:https://www.oschina.net/news/113392/jbeanbox-4-0-0-released
jBeanBox 4.0.0 發布,微形 Java IOC/AOP 工具已經有22次圍觀

http://coctec.com/news/all/show-post-224945.html