jfinal整合spring ioc、注解事务

原创
2014/12/21 01:16
阅读数 2.3K

代码地址 1. 整合ioc ioc整合很简单。根据jfinal手册操作即可。

2. 整合事务管理器 我的实现方式是这样的: 用spring管理连接池,而不用jfnal的连接池插件。然后实现一个IDataSourceProvider,套给jfianl的activerecord。

配置插件:

<!-- 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 {

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的事务管理:

<!-- 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&amp;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更好。

展开阅读全文
打赏
1
4 收藏
分享
加载中
无争博主

引用来自“走位风骚闪着腰”的评论

SpringPlugin spring = new SpringPlugin();
me.add(spring);

可以删掉?

引用来自“无争”的评论

看SpringDataSourceProvider。。

引用来自“走位风骚闪着腰”的评论

我的意思是上面俩行加上没啥意义了。
被你发现了。。getDataSource()里面也有类似spring插件的执行方法
2014/12/30 10:40
回复
举报

引用来自“走位风骚闪着腰”的评论

SpringPlugin spring = new SpringPlugin();
me.add(spring);

可以删掉?

引用来自“无争”的评论

看SpringDataSourceProvider。。
我的意思是上面俩行加上没啥意义了。
2014/12/30 10:11
回复
举报
无争博主

引用来自“走位风骚闪着腰”的评论

SpringPlugin spring = new SpringPlugin();
me.add(spring);

可以删掉?
看SpringDataSourceProvider。。
2014/12/30 02:07
回复
举报
SpringPlugin spring = new SpringPlugin();
me.add(spring);

可以删掉?
2014/12/30 00:00
回复
举报
更多评论
打赏
4 评论
4 收藏
1
分享
返回顶部
顶部