浏览 2546 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2016-06-20
最后修改:2016-06-20
以下是jBeanBox整合了c3p0数据池+JDBCTemplate+Spring声明式事务的一个例子,实测通过(只有单个文件)。 package examples.example3_transaction; import java.util.Properties; import net.sf.jbeanbox.BeanBox; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.interceptor.TransactionInterceptor; import com.mchange.v2.c3p0.ComboPooledDataSource; class DSPoolBeanBox extends BeanBox { { setClassOrValue(ComboPooledDataSource.class); setProperty("jdbcUrl", "jdbc:mysql://127.0.0.1:3306/test?user=root&password=yourpwd&useUnicode=true&characterEncoding=UTF-8"); setProperty("driverClass", "com.mysql.jdbc.Driver");//your jdbc driver name setProperty("maxPoolSize", 10); } } class JdbcTmpBox extends BeanBox { { setConstructor(JdbcTemplate.class, new Object[] { new DSPoolBeanBox() }); } } class TxManagerBox extends BeanBox { { setClassOrValue(DataSourceTransactionManager.class); setProperty("dataSource", new DSPoolBeanBox()); } } class TxInterceptorBox extends BeanBox {// Advice { Properties props = new Properties(); props.put("insert*", "PROPAGATION_REQUIRED"); setConstructor(TransactionInterceptor.class, new Object[] { new TxManagerBox(), props }); } } public class SpringTxTest { static {// AOP setting BeanBox.setAOPAround("examples.example3_transaction.SpringTx\\w*", "insert\\w*", new TxInterceptorBox(), "invoke"); } public void insertUser() { JdbcTemplate dao = new JdbcTmpBox().getBean(); dao.execute("insert into users values ('User1')"); int i = 1 / 0; // throw RuntimeException dao.execute("insert into users values ('User2')"); } public static void main(String[] args) { SpringTxTest tester = new BeanBox(SpringTxTest.class).getBean(); tester.insertUser(); } } 可以看到,insertUser方法中出错事务将整体回滚, Spring的声明服务生效了。XML彻底消失, 配置可以写在Java里随用随配, 非常方便。 顺便提一下, 从Spring3.0起自带一种基于JAVA的配置,但需要与注解配合使用,复杂难用,而且有以下问题:配置不能继承,运行期不能改配置,以方法名而不是类名来作为bean的缺省ID, 目标类重构时,方法名不能跟着自动变更, 必须手工更改,这就抵消了重构的意义。 如需运行此例,请修改实际数据库连接及下载下面提到的12个jar包。 或是从jBeanBox项目网站下载打包好的"Demo_jBeanBox2.0.war"文件,其中已包含此示例及所有库。 jBeanBox2.0所须包: http://central.maven.org/maven2/aopalliance/aopalliance/1.0/aopalliance-1.0.jar http://central.maven.org/maven2/asm/asm/3.3.1/asm-3.3.1.jar http://central.maven.org/maven2/org/aspectj/aspectjrt/1.8.9/aspectjrt-1.8.9.jar http://central.maven.org/maven2/cglib/cglib/2.2.2/cglib-2.2.2.jar 此示例所须包: http://central.maven.org/maven2/c3p0/c3p0/0.9.1.2/c3p0-0.9.1.2.jar http://central.maven.org/maven2/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.5/mysql-connector-java-5.1.5.jar http://central.maven.org/maven2/org/springframework/spring-aop/3.2.16.RELEASE/spring-aop-3.2.16.RELEASE.jar http://central.maven.org/maven2/org/springframework/spring-beans/3.2.16.RELEASE/spring-beans-3.2.16.RELEASE.jar http://central.maven.org/maven2/org/springframework/spring-core/3.2.16.RELEASE/spring-core-3.2.16.RELEASE.jar http://central.maven.org/maven2/org/springframework/spring-jdbc/3.2.16.RELEASE/spring-jdbc-3.2.16.RELEASE.jar http://central.maven.org/maven2/org/springframework/spring-tx/3.2.16.RELEASE/spring-tx-3.2.16.RELEASE.jar 如需用"pom.xml"下载包,可在项目主页找到。 jBeanBox可在github项目主页,或直接下载本贴附件,因为这个项目目前为止就只有一个Java文件。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2016-06-27
其实滨没有什么卵用
|
|
返回顶楼 | |
发表时间:2016-07-21
最后修改:2016-07-21
jBeanBox更新到2.2版,添加以下功能:
1.添加一个@InjectBox注解,也是此项目唯一一个注解。 2.除默认单例上下文外,支持多上下文,同一个项目中可以有多套不同配置,类似于Spring中可以生成多个ApplicationContext实例。 3.添加postConstructor和preDestroy回调。 4.添加一个getBean()静态方法,实现调用者与配置的解藕,以约定方式寻找配置,调用者无需直接与配置类打交道。 目前源码近1000行,依然是单个文件(多个类),继续招合作者,有兴趣的到可以https://sourceforge.net/projects/jbeanbox/看一下。 jBeanBox可以看成是Spring的精简版,Guice的加强版,结合了两者的一些特点。三者中,个人自认为jBeanBox的Java配置方式是最简单的。 上例中的源码现在更新为如下形式(已打好包的示例文件可在项目页下载): public class TesterBox extends BeanBox {//配置文件,XML的替代品 static { BeanBox.defaultContext.setAOPAround("examples.example5_transaction.Test\\w*", "insert\\w*", new TxInterceptorBox(), "invoke"); } static class DSPoolBeanBox extends BeanBox { { setClassOrValue(ComboPooledDataSource.class); setProperty("jdbcUrl", "jdbc:mysql://127.0.0.1:3306/test?user=root&password=yourPWD&useUnicode=true&characterEncoding=UTF-8"); setProperty("driverClass", "com.mysql.jdbc.Driver");// your jdbc driver name setProperty("maxPoolSize", 10); } } static class TxManagerBox extends BeanBox { { setClassOrValue(DataSourceTransactionManager.class); setProperty("dataSource", new DSPoolBeanBox()); } } static class TxInterceptorBox extends BeanBox {// Advice { Properties props = new Properties(); props.put("insert*", "PROPAGATION_REQUIRED"); setConstructor(TransactionInterceptor.class, new TxManagerBox(), props); } } public static class JdbcTemplateBox extends BeanBox { { setConstructor(JdbcTemplate.class, new DSPoolBeanBox()); } } } public class Tester {//目标类 @InjectBox private JdbcTemplate dao; public void insertUser() { dao.execute("insert into users values ('User1')"); int i = 1 / 0; //Throw a runtime Exception to roll back transaction dao.execute("insert into users values ('User2')"); } public static void main(String[] args) { Tester tester = BeanBox.getBean(Tester.class); tester.insertUser(); } } |
|
返回顶楼 | |
发表时间:2016-09-04
最后修改:2016-09-04
jBeanBox项目又有更新,示例中第一种配置更新如下:
public class TesterBox extends BeanBox { static { BeanBox.defaultBeanBoxContext.setAOPAround("examples.example5_transaction.Test\\w*", "insert\\w*", new TxInterceptorBox(), "invoke"); } static class DSPoolBeanBox extends BeanBox { { setClassOrValue(ComboPooledDataSource.class); setProperty("jdbcUrl", "jdbc:mysql://127.0.0.1:3306/test?user=root&password=root888"); setProperty("driverClass", "com.mysql.jdbc.Driver");// change to your jdbc driver name setProperty("maxPoolSize", 10); setProperty("CheckoutTimeout", 2000); } } static class TxManagerBox extends BeanBox { { setClassOrValue(DataSourceTransactionManager.class); setProperty("dataSource", DSPoolBeanBox.class); } } static class TxInterceptorBox extends BeanBox {// Advice { Properties props = new Properties(); props.put("insert*", "PROPAGATION_REQUIRED"); setConstructor(TransactionInterceptor.class, TxManagerBox.class, props); } } public static class JdbcTemplateBox extends BeanBox { { setConstructor(JdbcTemplate.class, DSPoolBeanBox.class); } } } 并增加第二种配置方式,这种方式与Spring的Java配置类似,支持方法名重构: public class TesterBox extends BeanBox { static { BeanBox.defaultBeanBoxContext.close();// clean up BeanBox.defaultBeanBoxContext.setAOPAround("examples.example6_type_safe.Test\\w*", "insert\\w*", new TxInterceptorBox(), "invoke"); } static class DSPoolBeanBox extends BeanBox {// Type-unsafe and type-safe configurations can mixed use. public DataSource create() { ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setUser("root"); return ds; } public void config(ComboPooledDataSource ds) { ds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test"); ds.setPassword("root888");// change to your PWD ds.setCheckoutTimeout(2000); } { setProperty("driverClass", "com.mysql.jdbc.Driver"); } } static class TxManagerBox extends BeanBox { public DataSourceTransactionManager create() { DataSourceTransactionManager dm = new DataSourceTransactionManager(); dm.setDataSource((DataSource) new DSPoolBeanBox().getBean()); return dm; } } static class TxInterceptorBox extends BeanBox {// Advice public TransactionInterceptor create() { Properties props = new Properties(); props.put("insert*", "PROPAGATION_REQUIRED"); return new TransactionInterceptor((DataSourceTransactionManager) new TxManagerBox().getBean(), props); } } public static class JdbcTemplateBox extends BeanBox { public JdbcTemplate create() { return new JdbcTemplate((DataSource) new DSPoolBeanBox().getBean()); } } } 详见http://git.oschina.net/drinkjava2/jBeanBox |
|
返回顶楼 | |