关于Guice的单例,自己一直都不是很明白,虽然其用户文档也看过几遍了,可能是本人太愚昧的缘故,一直很迷惑。今天又花了点时间试了一下,基本明白是怎么会事了。
要保证注入的实例是同一个对象,那么第二次注入时就不能再调用构造器了。
实现的方式用几种:
this.bind(Service.class).to(ServiceImp.class).in(Scopes.SINGLETON);
this.bind(Service.class).to(ServiceImp.class).asEagerSingleton()
this.bind(Service.class).to(ServiceImp.class).in(Singleton.class)
也可以直接在ServiceImp上加@Singleton注解,如果是通过@Provides产生的对象,则可以
用把@Provides @Singleton一起放在其方法上。
文档上说得很清楚:
In linked bindings, scopes apply to the binding source, not the binding target. Suppose we have a class Applebees that implements both Bar and Grill interfaces. These bindings allow for two instances of that type, one for Bars and another for Grills:
bind(Bar.class).to(Applebees.class).in(Singleton.class);
bind(Grill.class).to(Applebees.class).in(Singleton.class);
This is because the scopes apply to the bound type (Bar, Grill), not the type that satisfies that binding (Applebees). To allow only a single instance to be created, use a @Singleton annotation on the declaration for that class. Or add another binding:
bind(Applebees.class).in(Singleton.class);
意思是说提供实例的依据是根据其接口而定的,而不是通过其实现类来定的。
如果要让实现了Bar、Grill的Applebees只提供一个实例(上述情况),可以通过
@Singleton或
bind(Applebees.class).in(Singleton.class);
来实现。
实现好以后,就可以通过多次注入来检验是否第二次的注入不再调用其构造方法:
ServiceImp类的默认构造器:
public ServiceImp() {
System.out.println("ServiceImp=============");
}
测试类代码:
Injector injector = Guice.createInjector(new ServiceModel());
injector.injectMembers(this);
injector.injectMembers(this);
经过测试发现第二次注入并没有再调用其构造方法。
分享到:
相关推荐
当您在注入 dropwizard 配置或环境的类上有一个 guice 单例时,就会发生这种情况。 为避免这种情况,您可以: 将 guice 阶段设置为“DEVELOPMENT”,但所有内容都会以惰性模式加载 使用这样的包
- 支持自定义绑定策略,如绑定到特定类实例、单例、多例等。 7. **实战应用**: - 在Guice-3.0中,开发者可以通过创建自定义模块,定义依赖关系,然后在应用程序启动时加载该模块,让Guice负责对象的创建和管理。...
可以是单例、原型或预定义的实例。 4. **Annotations**: Guice 使用注解(如 @Inject、@Singleton 等)来标记需要注入的依赖,以及对象的生命周期。 **Guice 的使用步骤** 1. **创建 Module**: 编写自定义的 ...
还有如`@Singleton`、`@Named`等,分别表示单例模式和命名绑定。 3. **模块(Modules)**:Guice的配置是通过创建自定义的`Module`类实现的。在模块中,我们可以定义绑定(bindings),比如将接口绑定到具体的实现类...
其中将`Service`接口绑定到了`ServiceImpl`实现,并且指定了单例作用域(`Scopes.SINGLETON`),这意味着在整个应用程序生命周期中,对于任何请求的`Service`实例,Guice都会返回同一个对象。 2. **初始化注入器**...
4. **生命周期管理**:Guice支持多种对象生命周期策略,如单例(`@Singleton`)、原型(每次请求创建新实例)等。 5. **提供者(Provider)**:对于有特殊初始化需求或需要延迟创建的对象,可以通过自定义`Provider...
`@Inject`用于声明依赖,`@Singleton`表示单例模式,确保一个类型在整个应用程序中只有一个实例。 5. **测试**:在Guice中,我们可以使用`Guice.createInjector()`创建一个测试用的Injector,然后在这个Injector中...
- **作用域管理**:支持不同的作用域,如单例(Singleton)、原型(Prototype)等,以控制对象的生命周期。 - **面向切面编程**(Aspect-Oriented Programming, AOP):通过简单的配置即可实现切面逻辑的插入,简化...
`@Singleton`表示该对象为单例,`@Named`用于指定特定的依赖实现。 3. **模块(Modules)**:Guice中的模块是配置依赖关系的地方,通过扩展`AbstractModule`并重写`configure()`方法,我们可以声明绑定(Bindings)...
在这个方法中,我们使用了binder.bind方法将MyService接口绑定到MyServiceImpl实现类,并指定了Scopes.SINGLETON作用域,以确保MyServiceImpl对象是单例的。 Guice的其它使用特性 Guice还提供了一些其它的使用特性...
2. **生命周期管理**:Guice支持单例、原型等多种实例生命周期管理,与Jersey的生命周期管理相结合,提供了更灵活的对象创建策略。 3. **模块化**:通过Guice模块,可以将不同功能的组件分离,便于维护和扩展。 4. *...
6. **超集绑定(Scoping)**:Guice提供了多种范围,包括`@Singleton`(单例)、`@RequestScoped`(请求范围)、`@SessionScoped`(会话范围)等,可以根据应用场景选择合适的范围。 7. **Assisted Injection**:...
4. **减少样板代码**:使用 MyBatis-Guice,开发者不再需要编写大量的工厂方法和单例来获取 MyBatis 对象,从而降低了代码的冗余度。 在实际的项目中,集成步骤通常包括以下部分: 1. **添加依赖**:在 Maven 项目...
通过`@Singleton`注解,你可以声明一个类应被Guice以单例模式管理。 7. **AOP(面向切面编程)**:虽然Guice本身不支持完整的AOP,但可以通过与AspectJ等库结合,实现如日志记录、事务管理等切面功能。 8. **类型...
5. **绑定策略(Binding Scopes):** Guice支持多种绑定范围,如`@Singleton`(单例)、`@RequestScoped`(请求范围)、`@SessionScoped`(会话范围)等。这些范围可以帮助你管理对象的生命周期和并发访问。 6. **...
- **API限制**:如单例模式的强制使用,限制了应用模式的灵活性。 - **手工依赖注入**:虽然简化了测试过程,但仍需大量手工编写依赖注入代码,增加了维护成本。 #### 五、Guice的优势 - **更简洁的代码**:通过...
**Google Guice**,全称为Google Injection,是一个轻量级的依赖注入框架,它通过注解(Annotations)来实现对象的自动装配,简化了Java应用的构造和管理。Guice的核心理念是帮助开发者摆脱手动创建对象和管理对象...
5. **生命周期管理**:Guice会自动管理对象的生命周期,例如,你可以指定一个对象是否是单例的,或者在何时销毁。 通过学习和实践mybatis-guice-3.4.jar,你可以更深入地理解MyBatis和Guice的集成,从而在实际开发...