【1】、第一步,Maven引入Google的Guice的jar包;
<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.0</version> </dependency>
ps:其实我没有使用mavn,单独建了个maven项目,就为了,找jar包,然后,复制到,webRoot下的lib目录下,好狗血。
【2】、第二部,编写Jfinal的GuicePlugin.java和它配对的拦截器GuicePluginInterceptor.java;
GuicePlugin.java的代码如下:
包名我就不显示了。 import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.jfinal.plugin.IPlugin; /** * @author 韦甩甩 * @date 2016年1月13日 上午10:46:38 */ public class GuicePlugin implements IPlugin { public static Injector guice; private boolean isStarted = false; @Override public boolean start() { if( isStarted == true) return true; guice = (Injector) Guice.createInjector(new AbstractModule() { @Override protected void configure() { } }); isStarted = true; return true; } @Override public boolean stop() { isStarted = false; return true; } }
GuicePluginInterceptor.java拦截器的代码如下:
package 包名我就不显示了 import java.lang.reflect.Field; import com.google.inject.Inject; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; /** * 拦截器 * * @author 韦甩甩 * @date 2016年1月9日 下午11:04:18 */ public class GuicePluginInterceptor implements Interceptor { @Override public void intercept(Invocation 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.guice.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(); } }
【3】、第三步,在JfinalConfig类里加入插件
public class MyConfig extends JFinalConfig { /** * 配置插件 */ public void configPlugin(Plugins me) { me.add(new GuicePlugin()); } /** * 配置全局拦截器 */ public void configInterceptor(Interceptors me) { me.addGlobalActionInterceptor(new GuicePluginInterceptor()); } }
【4】、第四步,编写service接口和实现类
GuiceService.java代码如下:
import com.google.inject.ImplementedBy; /** * @author 韦甩甩 * @date 2016年1月13日 上午11:18:35 */ @ImplementedBy(GuiceServiceImpl.class) public interface GuiceService { public abstract String info(); }
接口实现类GuiceServiceImpl.java代码如下(@Singletion是为了实现单例模式,模仿springMVC):
引入import com.google.inject.Singleton;
import com.google.inject.Singleton; /** * @author 韦甩甩 * @date 2016年1月13日 上午11:18:35 */ @Singleton public class GuiceServiceImpl implements GuiceService { @Override public String info() { return "Hello Jfinal"; } }
【5】第五步,在controller类里使用,加上@Inject,就可以使用了,注意,引入的是import com.google.inject.Inject;
/** * IndexController */ public class IndexController extends Controller { @Inject private GuiceService guiceService;//注解servicedemo @ActionKey("/admin/index") public void index() { system.out.println(guiceService.info()); render("/view/platform/index.jsp"); } }
打完收工。