文档章节

Jfinal集成Guice完成ioc

山东-小木
 山东-小木
发布于 2013/07/24 22:26
字数 535
阅读 3274
收藏 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()去得到

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


© 著作权归作者所有

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

山东-小木

粉丝 223
博文 47
码字总数 29684
作品 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的Guice插件完成IOC

@jfinal Jfinal的Guice插件完成IOC 博文地址:http://my.oschina.net/imhoodoo/blog/146861 能完成IOC,唯一不是很舒服的地方就是在config中配置插件的时候需要挨个绑定注入的service 在con...

山东-小木
2013/07/24
1K
2
谈谈 jfinal 的优缺点

jfinal是国产优秀的web框架.jfinal短小精悍强大,易于使用.不过万事有度,省的太狠也不太好. 1.框架应该尽量兼容各种场景,因为你不知道以后的场景.框架是一个持续集成和更新的过程,对公司来说这...

光石头
2013/09/05
104.6K
81
Jfinal配合Guice使用

@Jfinal 你好,我想在Jfinal中使用Guice的IOC,直接根据Guice的配置,配置到Jfinal中可以吗?还是要写一个插件。有什么思路给说说好吗?谢谢了。

圣杰是也
2013/07/23
614
2
Hasor 2.5.1 发布,支持 JFinal 整合

Hasor 2.5.1 正式发布了。Hasor 是一款基于 Java 语言的应用程序开发框架,它的核心设计目标是提供一个简单、且必要的环境给开发者。开发者可以在此基础上,通过 Hasor 强有力的粘合机制,构...

哈库纳
2016/11/08
1K
3
kiplinglee/jfinal-ioc-plugin

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

kiplinglee
04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
12分钟前
0
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
21分钟前
4
0
Eos测试框架EosFactory

EOS Factory包含一个完整的EOS测试框架,可以进行智能合约的开发和测试。由Tokenika于创建于2017年的这个基于Python的EOS测试框架可以轻松地完成智能合约的开发、部署与测试。 如果你希望马上...

汇智网教程
36分钟前
5
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
3
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部