Guice + JSF 的实现
上一篇 /
下一篇 2008-03-19 15:26:10
/ 个人分类:Guice
今天终于把JSF和Guice整合到一起了,现在仅仅是实现了JSF和Guice的整合,可能我的实现还有一些问题,也或许还有更好的实现方法,希望能和大家一起切磋,对我有什么好的建议欢迎直接和我联系。我的Email:duqingming@126.com
Member.java 实体
MemberEntity.java 业务逻辑接口
MemberEntityImpl.java 业务逻辑实现
MemberRegister.java 页面的bean
以上都是我们做一个JSF应用最基本的都几个类和接口,这里代码没有给出,我想大家一看都明白。
下面几个类是为了把Guice整合到一起:
1.HawkUnionModule.java Guice 的模块类,Guice不像Spring 通过XML来配置
package com.hawkunion.config;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
import com.hawkunion.persistence.*;
/**
* @author 杜庆明
*/
public class HawkUnionModule extends AbstractModule {
public void configure() {
bind(MemberEntity.class).to(MemberEntityImpl.class).in(Scopes.SINGLETON);
}
}
2.GuiceListener.java 一个监听器,非常重要的,在ServletContext中一个属性
import com.hawkunion.member.MemberRegister;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @author 杜庆明
*/
public class GuiceListener implements ServletContextListener {
private static Logger logger = Logger.getLogger(MemberRegister.class.getName());
public void contextInitialized(ServletContextEvent servletContextEvent) {
Module[] modules = {new HawkUnionModule()};
Injector injector = Guice.createInjector(modules);
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute(Injector.class.getName(), injector);
logger.info("** 执行 GuiceListener.contextInitialized");
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.removeAttribute(Injector.class.getName());
logger.info("** 执行 GuiceListener.contextDestroyed");
}
}
当然不要忘了在web.xml中配置
<listener>
<description>Guice</description>
<listener-class>com.hawkunion.config.GuiceListener</listener-class>
</listener>
3.BasePageBean.java MemberRegister.java的父类,所有的页面bean都要继承自它
package com.hawkunion.config;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
package com.hawkunion.config;
import com.google.inject.Injector;
import com.hawkunion.member.MemberRegister;
import java.io.Serializable;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
/**
* @author 杜庆明
*/
public class BasePageBean implements Serializable{
private static Logger logger = Logger.getLogger(MemberRegister.class.getName());
private Injector injector;
public BasePageBean()
{ }
public Injector getInjector() {
if(injector == null) {
ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().
getExternalContext().getContext();
injector = (Injector)servletContext.getAttribute(Injector.class.getName());
}
return injector;
}
public void setInjector(Injector injector) {
this.injector = injector;
}
@PostConstruct
public void init() {
getInjector().injectMembers(this);
logger.info("执行Guice初始化 为"+this.getClass().getName()+"注入对象");
}
}
最后使用:
如我MemberRegister.java:
package com.hawkunion.member;
import com.google.inject.Inject;
import com.hawkunion.config.BasePageBean;
import com.hawkunion.persistence.Member;
import com.hawkunion.persistence.MemberEntity;
import com.hawkunion.persistence.MemberEntityImpl;
import java.util.Date;
import org.apache.log4j.Logger;
/**
* 实体类 MemberRegister
* @author 杜庆明
*/
public class MemberRegister extends BasePageBean{
private static Logger logger = Logger.getLogger(MemberRegister.class.getName());
private Member member = new Member();
private MemberEntity memberEntity = null;
public MemberRegister(){
}
public void setMember(Member member){
this.member = member;
}
public Member getMember(){
return member;
}
@Inject
public void memberEntity(MemberEntity memberEntity) {
this.memberEntity = memberEntity;
}
// 添加一个用户
public String create(){
super.init(); // 比较关键的一句
if(memberEntity!=null){
memberEntity.deleteMember("duqingming1");
} else{
logger.info("Guice 没有启动");
}
return "";
}
}
以后代码已经在netbeans5.5上验证通过,但可应用还有很多不足的地方,其中一个是在RemberRegister仍然需要调用super.init(),来显示的让Guice来为我们注入对象,因为时间问题,我还没有更好的实现。
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: