Jfinal 2.1 集成 Guice,实现注解功能, 加入Service接口和实现类,直接晒代码

【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");
	}
}

打完收工。

你可能感兴趣的:(接口,service,service,Guice,jFinal,jFinal,jFinal,jFinal,jFinal,2.1的注解)