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
]