Tag: guice

抽象超类中的Generic @Inject’d字段

考虑一组MVP-ish类型。 存在一个抽象的Presenter,带有View接口: public interface View { //… } public abstract class AbstractPresenter { @Inject V view; //… } 然后,让我们有一个特定的具体的presenter子类,其视图接口和实现: public interface LoginView extends View { //… } public LoginPresenter extends AbstractPresenter { //… } public class LoginViewImpl implements LoginView { //… } 在Dagger模块中,我们当然会定义一个@Provides方法: @Provides LoginView provideLoginView() { return new LoginViewImpl(); } 在Guice中你可以用同样的方式编写它,或者只是bind(LoginView.class).to(LoginViewImpl.class) 。 但是,在Dagger(来自Google的v1和2.0-SNAPSHOT)中,这会产生错误,因为在为AbstractPresenter创建绑定接线时,它无法确定V是什么。 另一方面,Guice指出,因为它实际上是在创建一个LoginPresenter […]

Guice和一般应用程序配置

对于用Java编写的监控软件,我考虑使用Google Guice作为DI提供商。 项目需要从外部资源(文件或数据库)加载其配置。 该应用程序旨在以独立模式或servlet容器运行。 目前,配置不包含依赖项注入的绑定或参数,只有一些全局应用程序设置(JDBC连接定义和关联的数据库管理/监视对象)。 我看到两个选择: 使用另一个库,例如Apache Commons Configuration ,它支持文件和JDBC配置源(以及许多其他) 要么 使用Guice -xml-config之类的Guice基于文件的插件来存储应用程序选项(如果有必要,这将允许稍后配置DI部分)。 您是否建议将Guice用于这两项任务,或者将一般应用程序配置与dependency injection分开? 您认为哪些优点和缺点最重要?

如何使用Guice @Inject到现有的对象层次结构?

我有一个现有的对象层次结构,其中一些对象具有需要注入的字段。 此外,还有一些其他对象是使用Google Guice构建的,需要注入对前面描述的对象层次结构中某些对象的引用。 我如何使用Guice进行此类注射? 问题是现有层次结构中的对象不是使用Guice构造的,因此默认情况下不受注入过程的影响。 当然, injector.injectMembers()方法能够注入现有的对象实例,但它不适用于对象层次结构。 对于那些想知道为什么我不能使用Guice构建提到的对象层次结构的人。 此层次结构表示GUI对象,并由GUI框架( Apache Pivot )从声明性GUI描述构建(实际上此过程可以描述为对象反序列化)。 这样接口构造相当简单,我只想将某些服务引用注入接口对象,反之亦然(对于回调)。 我目前要采取的方法如下所述。 为了注入预先存在的对象层次结构,只需让对注入感兴趣的所有对象实现某些接口,如: public interface Injectable { void injectAll(Injector injector); } 然后,这些对象将实现此接口,如下所示: public void injectAll(Injector injector) { injector.injectMembers(this); for (Injectable child : children) child.injectAll(injector); } 然后我只调用mainWindow.injectAll(injector)来获取层次结构中的根对象,并注入所有感兴趣的对象。 不是很好的解决方案,但一方面完成工作。 另一方面,我需要从此层次结构中注入对象。 我想这可以通过为这些对象实现自定义提供程序来完成。 我的问题有更好的解决方案吗? 也许我的方法也有问题?

有没有人和Guice一起使用ServiceLoader?

我一直希望通过我们的应用程序+构建系统在更大范围内尝试这一点,但更高的优先级继续将其推向次要位置。 这似乎是加载Guice模块的一种很好的方法,并避免了关于“硬编码配置”的常见抱怨。 单个配置属性很少自行更改,但您几乎总是会有一组配置文件,通常用于不同的环境(调试,生产等)。 ServiceLoader允许您提取定义为给定类型的服务的所有实现的列表。 将它与Guice放在一起,你得到: import java.util.ServiceLoader; import com.google.inject.AbstractModule; import com.google.inject.Module; public class ModuleLoader extends AbstractModule { private final Class type; public ModuleLoader(Class type) { this.type = type; } public static ModuleLoader of(Class type) { return new ModuleLoader(type); } @Override protected void configure() { ServiceLoader modules = ServiceLoader.load(type); for (Module module : modules) { install(module); […]

在Java中实现动态插件

我想在Java应用程序中实现动态插件function。 理想的情况是: 应用程序将使用getCapabilities()等方法定义接口Plugin 。 插件将是一个JAR pluginX.jar其中包含一个实现Plugin pluginX.jar类(可能还有其他一些)。 用户将pluginX.jar放在特殊目录中或设置指向它的配置参数。 用户不一定必须在其类路径中包含pluginX.jar 。 该应用程序将找到PluginXImpl (可能通过JAR清单,可能通过reflection)并将其添加到注册表。 客户端可以获得PluginXImpl的实例,例如,通过调用getPluginWithCapabilities(“X”) 。 用户不一定必须知道插件的名称。 我有一种感觉,我应该能够用peaberry做到这一点,但我无法理解文档。 我花了一些时间学习Guice,所以我的首选答案不是“使用Spring Dynamic Modules” 。 任何人都可以给我一个简单的想法,如何使用Guice / peaberry,OSGi,或只是简单的Java?

guice的TypeLiteral如何工作?

Guice的TypeLiteral如何克服Javagenerics类型擦除过程? 它创造了奇迹,但这是如何实现的?

Jersey,Guice和Hibernate – EntityManager线程安全

我在我的应用程序中以相同的方式使用了本教程: http : //www.benmccann.com/hibernate-with-jpa-annotations-and-guice/ 我的应用程序是JAX-RS Web服务,它将接收许多并发请求并对数据库进行更新。 GenericDAOImpl.java实现: public class GenericDAOImpl implements GenericDAO { @Inject protected EntityManager entityManager; private Class type; public GenericDAOImpl(){} public GenericDAOImpl(Class type) { this.type = type; } @Override public void save(T entity) { entityManager.getTransaction().begin(); entityManager.persist(entity); entityManager.getTransaction().commit(); } } 如果2个并发线程试图保存实体,我得到 java.lang.IllegalStateException: Transaction already active 如果我评论交易,保存效果很好。 我试过用 @Inject protected Provider entityManagerProvider; 要么 @Inject protected […]

配置Guice模块提供的对象

我有一个提供JDBI DBI实例的Module ,如下所示: @Provides @Singleton DBI dbi(DataSource dataSource) { return new DBI(dataSource); } 在另一个模块中,我想在该DBI实例上调用一些初始化方法(配置对特定数据类型的支持)。 放入JDBI模块本身并不合适,因为它的应用程序特定于使用JDBI的任何应用程序都不通用。 我有没有勾选做那种“额外”的配置? 我尝试使用bindListener方法,但似乎没有调用以这种方式提供的对象。

使用带有DAO模式的Guice进行dependency injection

对于我正在研究的小型项目,我一直在努力为我与DB的交互实现一些DAO模式,并且已经开始使用Guice(我第一次)为我处理DI。 现在我有这个类层次结构: DAOImpl引用类类型,因此我的数据库客户端(mongo / morphia)可以执行一些初始化工作并实例化BasicDAO提供的BasicDAO。 以下是相关课程的片段: public class DAOImpl implements DAO { private static final Logger LOG = LoggerFactory.getLogger(DAOImpl.class); private static final String ID_KEY = “id”; private final org.mongodb.morphia.dao.DAO morphiaDAO; @Inject public DAOImpl(Datastore ds, Class resourceClass) { morphiaDAO = new BasicDAO(resourceClass, ds); LOG.info(“ensuring mongodb indexes for {}”, resourceClass); morphiaDAO.getDatastore().ensureIndexes(resourceClass); } } public class UserDAO extends […]

嵌入式Jetty处理url以提供内容

我正在使用嵌入式Jetty和Guice,我想知道处理我的单页应用程序的最佳方法。 我希望Jetty能够处理这样的请求(优先顺序): /socket必须由websocket servlet处理 /fs/read/* ,与此url匹配的任何内容我需要由自定义servlet处理 /* ,任何与此url匹配的内容都应该从我的Java应用程序的类路径上的/web提供,假设它不是由上面的处理。 如果资源不存在,则它提供/web/index.html 现在我想知道处理这个问题的最佳方法吗? 使用REST框架似乎很苛刻,因为我没有任何rest服务。 目前我正在设置Jetty: ServletHolder servletHolder = new ServletHolder(DefaultServlet.class); ServletContextHandler servletContextHandler = new ServletContextHandler(server, “/”, ServletContextHandler.SESSIONS); servletContextHandler.addFilter(GuiceFilter.class, “/*”, EnumSet.allOf(DispatcherType.class)); servletContextHandler.addServlet(servletHolder, “/”); ResourceHandler resHandler = new ResourceHandler(); resHandler.setBaseResource(Resource.newClassPathResource(“/web”)); server.setHandler(resHandler); 这是我的Guice ServletModule : serve(“/socket/*”).with(WebSocketManagerServlet.class); serve(“/fs/read/*”).with(MyCustomServlet.class); 但是,我不知道如何做最后一条规则,它重定向任何与index.html不匹配的东西,并且仍然让jetty发出正确的标题,为css/js/html等正确的mime类型.Petty也可能做一些内存映射和花哨的东西,以便快速提供这些,我想维护。