文档章节

Jfinal集成Guice完成ioc

山东-小木
 山东-小木
发布于 2013/07/24 22:26
字数 535
阅读 3247
收藏 17

@jfinal 

由于目前Jfinal中缺少IOC的实现 项目中使用了Jfinal用来控制转发 orm等 为了让开发人员尽量少于sql语句打交道

我又分离出了service层,需要在Controller中调用service提供的服务操作数据库,需要使用到依赖注入ioc

不想使用spring,于是换做google的Guice

下面来看具体插件代码:

GuicePlugin.java

package guice;

import java.util.HashMap;
import java.util.Map.Entry;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.jfinal.plugin.IPlugin;
/**
 * Guice IOC plugin
 * @author xwalker <br/> http://my.oschina.net/imhoodoo
 */
public class GuicePlugin implements IPlugin {
	private static Injector guice;
	//绑定注入的map
	@SuppressWarnings("rawtypes")
	private HashMap<Class, Class> bindMap;
	/**
	 * 默认构造函数 初始化绑定注入map
	 */
	@SuppressWarnings("rawtypes")
	public GuicePlugin() {
		bindMap = new HashMap<Class, Class>();
	}
	/**
	 * 绑定依赖
	 * @param bindSrc
	 * @param bindTo
	 */
	public void bind(Class<?> bindSrc, Class<?> bindTo) {
		bindMap.put(bindSrc, bindTo);
	}
	/**
	 * 封装guice中的getInstance
	 * @param clazz
	 * @return
	 */
	public static <T> T getInstance(Class<T> clazz){
		return guice.getInstance(clazz);
	}

	@Override
	public boolean start() {
		guice = Guice.createInjector(new Module() {
			@SuppressWarnings("unchecked")
			@Override
			public void configure(Binder binder) {
				for (@SuppressWarnings("rawtypes") Entry<Class, Class> entry : bindMap.entrySet()) {
					binder.bind(entry.getKey()).to(entry.getValue());
				}
			}
		});
		return true;
	}

	@Override
	public boolean stop() {
		return true;
	}

}

这里用一个bindMap来记录绑定依赖注入

start的时候会调用Guice进行bind

GuiceInterceptor.java

package guice;

import java.lang.reflect.Field;

import com.google.inject.Inject;
import com.jfinal.aop.Interceptor;
import com.jfinal.core.ActionInvocation;
import com.jfinal.core.Controller;
/**
 * Guice ioc interceptor
 * @author xwalker <br/> http://my.oschina.net/imhoodoo
 *
 */
public class GuiceInterceptor implements Interceptor {
	@Override
	public void intercept(ActionInvocation ai) {
		/*
		 * 得到拦截的controller 判断是否有依赖注入的属性
		 */
		Controller controller = ai.getController();
		Field[] fields = controller.getClass().getDeclaredFields();
		for (Field field : fields) {
			Object bean = null;
			if (field.isAnnotationPresent(Inject.class))
				bean = GuicePlugin.getInstance(field.getType());
			else
				continue;
			
			try {
				if (bean != null) {
					field.setAccessible(true);
					field.set(controller, bean);
				}
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}
		
		ai.invoke();
	

	}

}

在Jfinalconfig中配置插件

/**
	 * 配置神奇的GUICE IOC组件
	 * @param me
	 */
	private void configIoc(Plugins me) {
		GuicePlugin guicePlugin=new GuicePlugin();
		guicePlugin.bind(BaseService.class, DbService.class);
		me.add(guicePlugin);
		
	}

这样在controller中就可以使用DbService依赖注入了 使用注解@Inject

public class DBController extends Controller {
	@Inject
	private DbService dbService;
}

有一个比较麻烦的地方就是需要依赖注入的service 都需要在配置中添加bind

binder.bind(entry.getKey()).to(entry.getValue())

guicePlugin.bind(BaseService.class, DbService.class);

Guice中不知道还有没有其他方式配置 只需要注解 不需要其他像bind的方式

还有就是注入的service在使用的时候需要使用guice.getInstance()去得到

感觉这里有点麻烦,请高手解答。


© 著作权归作者所有

共有 人打赏支持
山东-小木

山东-小木

粉丝 208
博文 42
码字总数 26536
作品 1
东营
CEO
加载中

评论(32)

理工男海哥
理工男海哥
... 才发现这篇文章是4年前的了....
理工男海哥
理工男海哥
其实在controller里使用@Inject没有太大的意义,其意义是走AOP,比如说在微服务中,通过@Inject后的service,去调用数据的时候,可以对其调用统计,错误统计,流量限制,连接断开等。
同时您说的在service里写代码,可以再service里添加上某个注解,然后在插件启动的时候扫描添加进去,不再需要在service里写代码。
同时拦截器的实现有点啰嗦,可能使用 Guice.createInjector().injectMembers(controller);一行代码即可。

@JFinal @小木学堂
Mr.CT
Mr.CT
再加个注解啊。就不用手动bind
相信你自己
相信你自己
#此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名#
哈库纳
哈库纳

引用来自“xwalker”的评论

引用来自“JFinal”的评论

谢谢分享,顶一个

有没有更好的方式啊 guice虽然比spring轻量 但是需要调用guice的bind函数太费劲了 service多了的话 需要写很多啊

类扫描把,用类扫描去解决
laizhiming
laizhiming
我是来看评论的,博大精深啊。
黄亿华
黄亿华

引用来自“xwalker”的评论

引用来自“黄亿华”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

谢谢分享,顶一个

有没有更好的方式啊 guice虽然比spring轻量 但是需要调用guice的bind函数太费劲了 service多了的话 需要写很多啊

如果Service是无状态的,我会直接在Controller 中这样: private XxxService xxxService = new XxxService(),世间本无事,很多人都忘了new 是怎么用的了

Controller中使用的service 使用的时候加载一次 单例 使用new的话 每次都创建新的啊

忘写了一个static,应该是这样的private static final XxxService xxxService = new XxxService()

这样如果两个类都要用到这个service,是不是就要new两次?如果这个service是有状态的,好像只能写单例了?

service无状态

看了一下jfinal的源码,遇到这种全局状态,是直接用static来保存的,调用set方法时直接就是这么写的...

public ActiveRecordPlugin setShowSql(boolean showSql) {
    DbKit.setShowSql(showSql);
    return this;
  }

好像也没啥问题,长见识了...
黄亿华
黄亿华

引用来自“xwalker”的评论

引用来自“黄亿华”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

谢谢分享,顶一个

有没有更好的方式啊 guice虽然比spring轻量 但是需要调用guice的bind函数太费劲了 service多了的话 需要写很多啊

如果Service是无状态的,我会直接在Controller 中这样: private XxxService xxxService = new XxxService(),世间本无事,很多人都忘了new 是怎么用的了

Controller中使用的service 使用的时候加载一次 单例 使用new的话 每次都创建新的啊

忘写了一个static,应该是这样的private static final XxxService xxxService = new XxxService()

这样如果两个类都要用到这个service,是不是就要new两次?如果这个service是有状态的,好像只能写单例了?

service无状态

好吧...我倒是理解service会有一些全局的状态。jfinal不了解,但是在用Spring时,倒是常有在service初始化的时候放一些东西进去,例如初始化一个线程池什么,如果重复new,可能就不对了。
山东-小木
山东-小木

引用来自“黄亿华”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

谢谢分享,顶一个

有没有更好的方式啊 guice虽然比spring轻量 但是需要调用guice的bind函数太费劲了 service多了的话 需要写很多啊

如果Service是无状态的,我会直接在Controller 中这样: private XxxService xxxService = new XxxService(),世间本无事,很多人都忘了new 是怎么用的了

Controller中使用的service 使用的时候加载一次 单例 使用new的话 每次都创建新的啊

忘写了一个static,应该是这样的private static final XxxService xxxService = new XxxService()

这样如果两个类都要用到这个service,是不是就要new两次?如果这个service是有状态的,好像只能写单例了?

service无状态
黄亿华
黄亿华

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

引用来自“xwalker”的评论

引用来自“JFinal”的评论

谢谢分享,顶一个

有没有更好的方式啊 guice虽然比spring轻量 但是需要调用guice的bind函数太费劲了 service多了的话 需要写很多啊

如果Service是无状态的,我会直接在Controller 中这样: private XxxService xxxService = new XxxService(),世间本无事,很多人都忘了new 是怎么用的了

Controller中使用的service 使用的时候加载一次 单例 使用new的话 每次都创建新的啊

忘写了一个static,应该是这样的private static final XxxService xxxService = new XxxService()

这样如果两个类都要用到这个service,是不是就要new两次?如果这个service是有状态的,好像只能写单例了?
JFinal极速开发实战教程新鲜出炉~

JFinal极速开发实战教程新鲜出炉~ [持续更新中...] JFinal框架让 IT 工程师发挥更大的潜能,实现更大价值,同时也希望 JFinal 工具力量能帮助正在创业的朋友们提升效率、降低成本从而实现创业...

山东-小木
2015/01/07
0
13
JFinal 中使用 Dubbo —— 1 改造JFinal Demo

Dubbo Demo概述 此Demo实际在2014年上半年就已经完成了,只是到最近才有时间和心情写完此文。同时,将JFinal升级到了1.9,并采用Maven构建项目。 另外,仔细想了想,Provider其实可以不依托T...

糊搞
2015/04/20
0
16
OSC上关于Jfinal的提问整理(二)

1.【问】:Db.tx(new IAtom())事务不起作用? 【jfinal答】:1:如果使用的mysql,确保引擎为 InnoDB 2:这行代码改一下Db.save(c3p0Plugin.getDataSource(), "tbtest", "PKID", record);去掉...

木川瓦兹
2013/04/25
0
2
kiplinglee/jfinal-ioc-plugin

jfinal-ioc-plugin JFinal 依赖注入插件 1.在JFinalConfig文件中配置IOC插件 @Overridepublic void configConstant(Constants me) { // 创建controller实现依赖注入me.setControllerFactory......

kiplinglee
04/13
0
0
Jfinal集成Spring插件

最近公司使用Jfinal开发项目,不知道什么原因Jfinal和其他的几个插件集成的时候,事物管理并不那么随心,所以就选择了Spring作为Jfinal的插件来管理事物.废话不多说,直接上代码. IocKit.java S...

方宏春
09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis常用命令

keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行k...

谢思华
42分钟前
2
0
关于css宽度分离

所谓宽度分离就是width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存 例如: .box{width:200px;padding:20px;border:1px solid;} 为何要做宽度分离 一说到分离就是为了好...

莫西摩西
53分钟前
1
0
Linux常用命令

###############常用命令说明############################## cat /proc/version 显示内核的版本 mv dir1 new_dir 重命名/移动 一个目录 rm -rf a.txt b.txt c.txt 删除多个文件 chmod 777 ......

lyle_luo
今天
3
0
全国地区代码科普

全国地区代码表 天津市 地区代码 地区名称 1100 天津市 辽宁省 地区代码 地区名称 2210 沈阳市 2210 法库县 2210 康平县 2210 辽中县 2210 新民市 2220 大连市 2222 普兰店市 2223 庄河市 22...

恋码之子
今天
1
0
DbForge Schema Compare for MySQL入门教程:生成比较报告

【dbForge Schema Compare for MySQL下载】 当架构比较完成后,您可以生成比较报告以保留架构更改的记录。 1. 在“Comparison” 菜单中,单击“Generate Comparison Report” 。将打开“Gen...

Miss_Hello_World
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部