Jfinal 2.1 集成 Guice,實現註解功能, 加入Service接口和實現類,直接曬代碼

【1】、第一步,Maven引入Google的Guice的jar包;java

 <dependency>
	<groupId>com.google.inject</groupId>
	<artifactId>guice</artifactId>
	<version>4.0</version>
  </dependency>

ps:其實我沒有使用mavn,單獨建了個maven項目,就爲了,找jar包,而後,複製到,webRoot下的lib目錄下,好狗血。web

【2】、第二部,編寫Jfinal的GuicePlugin.java和它配對的攔截器GuicePluginInterceptor.java;spring

GuicePlugin.java的代碼以下:jsp

包名我就不顯示了。
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攔截器的代碼以下:maven

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類里加入插件ide

  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接口和實現類ui

GuiceService.java代碼以下:google

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):spa

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

打完收工。

相關文章
相關標籤/搜索