我说一下我在实际的项目中是怎么样使用guice的。会从entity-dao-action的路子走。 1.实体类 @Entity @Table(name = "user") public class User { /** * */ private static final long serialVersionUID = 5783459899984253122L; private String id; @Column(name = "username") private String name; @Id @Column(length = 36, nullable = false) @GeneratedValue(generator = "hibernate-uuid.hex") @org.hibernate.annotations.GenericGenerator(name = "hibernate-uuid.hex", strategy = "uuid.hex") public String getId() { return id; } /** * @param id * the id to set */ public void setId(String id) { this.id = id; } /** * 得到用户名称 */ public String getName() { return name; } /** * 设置用户名称 * * @param name */ public void setName(String name) { this. name = name; } } 2.Dao层 Public interface UserDao { Public List<User> getAllUser(); } Public Class UserDaoHibernate implements UserDao { Public List<User> getAllUser() { ……省略。。 } } 3.配置guice ,所有的自己写的Module都继承这个类 (1) 监听器 作用是初始化guice,并连接数据库 public class SystemStartupListener extends GuiceServletContextListener { final static Logger log = LoggerFactory .getLogger(SystemStartupListener.class); private Injector _injector; private SessionFactory _sf; /* * (non-Javadoc) * * @see * javax.servlet.ServletContextListener#contextInitialized(javax.servlet * .ServletContextEvent) */ @Override public void contextInitialized(ServletContextEvent event) { String serverPath=event.getServletContext().getRealPath("/upload"); log.info("OIA system startup..."); super.contextInitialized(event); View view=new View(serverPath); //build hibernate sessionFactory Configuration conf = _injector.getInstance(Configuration.class); _sf = conf.buildSessionFactory(); //LDAP sync data LDAPUtils ldap = new LDAPUtils(); // ldap.batchInsertOrgDataFromLdap(_sf, ldap.getAllOrganization()); // ldap.batchInsertUserDataFromLdap(_sf, ldap.getAllEmployee()); // /** // * 创建全文检索索引 // */ // if(!LuceneIndex.indexInit){ // LuceneUtils.createIndex(1); // } } /* * (non-Javadoc) * * @seejavax.servlet.ServletContextListener#contextDestroyed(javax.servlet. * ServletContextEvent) */ @Override public void contextDestroyed(ServletContextEvent event) { super.contextDestroyed(event); if(null != _sf) { _sf.close(); log.info("Hibernate session factory is closed..."); } log.info("OIA system shutdown..."); } @Override protected Injector getInjector() { return _injector = Guice.createInjector(new WebServiceModule()); } } (2) public class WebServiceModule extends ServiceModule { final Logger log = LoggerFactory.getLogger(WebServiceModule.class); private static Set<Module> modules = Collections.synchronizedSet(new HashSet<Module>()); private static Set<Class<?>> accessors = Collections.synchronizedSet(new HashSet<Class<?>>()); private static Set<Class<?>> annotatedClasses = Collections.synchronizedSet(new HashSet<Class<?>>()); protected void installModules() { // 装配模块 , modules.add(Module); // 自己写的那个module modules.add(new UserModule()); } /** * 装配自己的Module,需继承AbstractModule */ @Override protected final void config() { installModules(); for(Module m : modules) { if (log.isDebugEnabled()) log.debug("OIA install module: {}", m); if (m instanceof AbstractWarpModule) { if (((AbstractWarpModule) m).getAccessors()!= null) accessors.addAll(((AbstractWarpModule) m).getAccessors()); annotatedClasses.addAll(((AbstractWarpModule) m).getAnnotatedClasses()); } install(m); } } /** * 如果直接用接口实现Finder,则需要在此加入该接口 */ @Override protected final Iterator<Class<?>> getAccessors() { return accessors.iterator(); } /** * 注入领域模型对象 */ @Override protected final Iterator<Class<?>> getAnnotatedClasses() { return annotatedClasses.iterator(); } } (3) public abstract class AbstractWarpModule extends AbstractModule { /** * 如果直接用接口实现Finder,则需要在此加入该接口 */ protected List<Class<?>> getAccessors() { return null; } /** * 注入领域模型对象 */ protected abstract List<Class<?>> getAnnotatedClasses(); } (4).UserModule public class UserModule extends AbstractWarpModule{ @Override protected List<Class<?>> getAnnotatedClasses() { List<Class<?>> list = new ArrayList<Class<?>>(); list.add(User.class); return list; } @Override protected void configure() { staticParamOf(); } /** * 元数据相关 */ protected void staticParamOf(){ bind(ISystemStaticParamServer.class).to(SystemStaticParamServerImp.class) .asEagerSingleton(); } } 5.struts2 action中的dao注入。关键字 @Inject Public class UserAction extends ActionSupport { @Inject private UserDao userDao; public String test() { this.userDao.getAllUser(); // 这样就可以得到所有的user了。 return SUCCESS; } } 注:1.可以先将dao注入到entity中,在action中只注入entity就可以了,写法是一样的。自由发挥。2.别忘了把guice的包导入到工程中。