文档章节

Jfinal集成Guice完成ioc

JFinal-小木
 JFinal-小木
发布于 2013/07/24 22:26
字数 535
阅读 3183
收藏 17
点赞 1
评论 32

@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()去得到

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


© 著作权归作者所有

共有 人打赏支持
JFinal-小木
粉丝 195
博文 40
码字总数 24752
作品 0
东营
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-小木
JFinal-小木

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

引用来自“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是有状态的,好像只能写单例了?
kiplinglee/jfinal-ioc-plugin

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

kiplinglee ⋅ 04/13 ⋅ 0

JFinal 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal ⋅ 04/28 ⋅ 129

jfinal-admin 3.2 发布,beetl 模板升级到 2.7.14

jfinal-admin 3.2 版本正式发布啦。 基于JFinal的后台管理系统,采用了简洁强大的JFinal作为web框架,模板引擎用的是beetl,数据库用mysql,前端bootstrap框架。 演示地址 http://jad.yxyun...

IT小香猪 ⋅ 04/19 ⋅ 0

JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal ⋅ 2012/03/18 ⋅ 496

JFinal 1.6可以无缝升级到最高哪个版本?

大约在JFinal 1.6的时候做了一个项目,一直运行至今。中途没升级也没做功能扩展,时至今日,需要做功能升级了,但是时隔太久远,基本不记得JFinal这个框架一路过来的升级过程了。所以想请求帮...

车开源 ⋅ 05/11 ⋅ 0

JFinal如何使用JNDI连接数据库

想用JNDI的方式连接数据库,但是JFinal中用的是DruidPlugin和ActiveRecordPlugin,没有看到用DataSource的地方?请问JFinal支持JNDI连接方式吗?怎么具体实现?...

zqq3436 ⋅ 06/11 ⋅ 0

Jboot v1.4.9 发布,核心 JFinal 升级到 3.4 最新版本

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/03 ⋅ 0

jfinal兼容oracle integer字段

为什么oracle integer字段用了number(3,0),jfinal生成的字段还是BigDecimal @jfinal

tianxia007 ⋅ 05/02 ⋅ 0

基于注释自动生成 API 文档 - Regan API

Regan API 前言 Regan API 项目是基于注释自动生成api文档,很大缩短了开始与后期维护API接口文档的时间。 Regan API 利用jdk提供的Doclet 类读取文档注释,可手动配置需要读取的文件,同时增...

Jeff_Regan ⋅ 06/15 ⋅ 0

JFinal(1.6)在Validator里执行过getFile,在Controller里取不到文件

JFinal在Validator里执行过getFile之后Validator中是可以取到文件及有关信息,但是在Controller里取不到文件,是不是我的姿势不正确?@JFinal

车开源 ⋅ 05/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 20分钟前 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 28分钟前 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 41分钟前 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 51分钟前 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 今天 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例

准备磁盘分区 fdisk /dev/sdb n 创建三个新分区,分别1G t 改变分区类型为8e 准备物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出当前的物理卷 pvremo...

Linux_老吴 ⋅ 今天 ⋅ 0

zabbix 3.4安装

#已装好lamp环境 1.安装相关yum仓库 rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm #tip:rpm -ql zabbix-release 看上面这个软件装了哪些东......

山月关 ⋅ 今天 ⋅ 0

Java的Excel导出工具类

首先在POM中引入需要的Jar <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>o......

Kxvz ⋅ 今天 ⋅ 0

springboot 使用jsp

目录结构: 启动文件的Application必须在contorller文件的父级 文件路径在src/main/webapp下面 我的配置:前缀是/WEB-INF/jsp/ pom.xml需要加入tomcat-embed-jasper, 对jsp的支持的依赖 <de...

夜醒者 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部