Jfinal集成Guice完成ioc

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

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


转载于:https://my.oschina.net/imhoodoo/blog/146861

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JFinal是一款基于Java的轻量级Web开发框架,而Shiro是一个强大且易用的Java安全框架。集成JFinal和Shiro可以为你的应用程序提供更好的安全性和权限控制。 要在JFinal集成Shiro,你需要进行以下步骤: 1. 添加Shiro依赖:在你的项目中添加Shiro的依赖,可以通过Maven或者手动下载jar包的方式引入。 2. 创建Shiro配置类:创建一个继承自JFinalJFinalConfig类,并重写configConstant()和configInterceptor()方法。在configConstant()方法中配置Shiro的相关参数,如设置登录页面、未授权页面等。在configInterceptor()方法中添加Shiro的拦截器,用于实现权限控制。 3. 创建ShiroRealm类:创建一个继承自org.apache.shiro.realm.AuthorizingRealm的类,用于实现用户认证和授权逻辑。在该类中,你需要重写doGetAuthenticationInfo()方法用于用户认证,以及重写doGetAuthorizationInfo()方法用于用户授权。 4. 配置ShiroFilter:在JFinal的configRoute()方法中配置ShiroFilter,用于拦截请求并进行权限验证。你可以通过配置URL的匹配规则和相应的权限要求来实现不同页面的权限控制。 5. 配置登录和注销功能:在JFinal的Controller中添加登录和注销的处理逻辑,包括用户登录验证、生成和保存用户的身份信息等。 6. 配置权限注解:使用Shiro的注解来标记需要进行权限验证的方法或类,以实现细粒度的权限控制。 以上是集成JFinal和Shiro的基本步骤,你可以根据具体需求进行更详细的配置和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值