代碼地址 1. 整合ioc ioc整合很簡單。根據jfinal手冊操做便可。java
2. 整合事務管理器 個人實現方式是這樣的: 用spring管理鏈接池,而不用jfnal的鏈接池插件。而後實現一個IDataSourceProvider,套給jfianl的activerecord。mysql
配置插件:git
<!-- lang: java --> /** * 配置插件 */ public void configPlugin(Plugins me) { SpringPlugin spring = new SpringPlugin(); me.add(spring); SpringDataSourceProvider prov = new SpringDataSourceProvider(); // 配置ActiveRecord插件 ActiveRecordPlugin arp = new ActiveRecordPlugin(prov); me.add(arp); arp.addMapping("blog", Blog.class); // 映射blog 表到 Blog模型 }
SpringDataSourceProvider : <!-- lang: java --> public class SpringDataSourceProvider implements IDataSourceProvider {spring
private ApplicationContext ctx; private static final String proxyDsName = "proxyDataSource"; private String beanName; public SpringDataSourceProvider(String beanName){ this.beanName = beanName; } public SpringDataSourceProvider(){ this.beanName = proxyDsName; } @Override public DataSource getDataSource() { if(IocInterceptor.ctx==null){ IocInterceptor.ctx = new FileSystemXmlApplicationContext(PathKit.getWebRootPath() + "/WEB-INF/applicationContext.xml"); } ctx = IocInterceptor.ctx; DataSource ds = null; ds = (DataSource)ctx.getBean(beanName,TransactionAwareDataSourceProxy.class); return ds; }
須要特別注意的是在applicationContext.xml中要配置一個代理的datasource來進行spring的事務管理:sql
<!-- lang: xml --> <!-- datasource 數據源 --> <bean id="targetDataSource" name="targetDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 指定鏈接數據庫的驅動--> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <!-- 指定鏈接數據庫的URL--> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/> <!-- 指定鏈接數據庫的用戶名--> <property name="user" value="root"/> <!-- 指定鏈接數據庫的密碼--> <property name="password" value=""/> </bean> <bean id="proxyDataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"> <constructor-arg> <ref bean="targetDataSource" /> </constructor-arg> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="proxyDataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
具體項目地址數據庫
注: jfinal對spring的支持並非很好,每次請求都會經過iocInterceptor反射controller ,每次getBean在設置值。。 仍是不建議用jfnal+spring的形式。用純spring或者純jfinal更好。app