尝试使用 @BeforeEach 代替 @Before 注解。
抽象可以使用接口来表示,具体就是具体的实现类。configuration的作用就是把具体的实现类和接口绑定起来。
稍微改了下代码, 这种情况下, 似乎只有使用 Provide 了
trait Db class MemoryDb extends Db @Singleton class DatabaseActor @Inject() (@Name("MemoryDb") db: Db) extend Actor { // ...... } // 这里还是使用的 bind 来绑定注入 class DbClient @Inject() (@Name("DbActor") actorRef: ActorRef) // ActorSystem 可以由启动类中来实例化 class MyModule(system: ActorSystem) extends AbstractModule with ScalaModule { bind[Db].annotatedWith(Names.named("MemoryDb")).to[MemoryDb] @Provides @Named("DbActor") // 这里的参数 Db 只有靠 Provide 的绑定传递了. def dbActorRef(db: Db): ActorRef = { system.actorOf(Props.create(classOf[DbActor], db)) } }
需要,行,视情况而定
因为final 修饰后定义时必须实例化,而且其他地方不能修改
我觉得
如果要自动化: 就只使用 spring ,不要混入 Guice。老师最后的总结中也说了这个问题,spring项目的话就使用spring的注入就好了,没必要引入Guice,但是有可能你引用别人的项目,别人使用的是Guice,这时就要用到老师课程中的混合啦。
刚开始看第7章,看到那么多的 @Bean ,头都大了。 但是,看到后面就没那多多了(好像只剩下两个了,有一个是引入`com.google.inject.Injector`的,这个应该是必须的)。 后面都重构了的。你可以下载源码看下。
不然每一个guice组件都要在spring @Bean手动注入,逻辑业务组件一多起来,这样感觉也挺麻烦的
我的理解是: 使用 @Bean 引入 `com.google.inject.Injector` 就可以了,其他的都交给 Guice
解决了,是包安装的不对,这个是在com.google.inject.extensions包里面的
首先非常谢谢同学的肯定。
运行时的话,Inject一个Injector,然后通过Injector来getInstance。在与spring协作这里就是这么用的。
一个module需要另一个module的话,用install,然后就可以inject别人绑定的实例了。当然如果有重复绑定,需要用Modules.override。
另外,非常感谢同学对我课程的肯定。非常高兴能看到我的课程给大家带来收获。
注入的是支持的货币类型,是一个set类型
定义module绑定
package org.demo.guicedemo.server.impl; import com.google.inject.AbstractModule; import com.google.inject.multibindings.Multibinder; public class ChinaModule extends AbstractModule { @Override protected void configure() { // Adds CNY support Multibinder.newSetBinder(binder(), String.class) .addBinding().toInstance("CNY"); } }
就会往集合中添加值CNY
package org.demo.guicedemo.server.impl; import com.google.inject.AbstractModule; import com.google.inject.multibindings.Multibinder; public class GlobalModule extends AbstractModule { @Override protected void configure() { // Adds EUR, USD support Multibinder<String> currencyBinder = Multibinder.newSetBinder(binder(), String.class); currencyBinder.addBinding().toInstance("EUR"); currencyBinder.addBinding().toInstance("USD"); } }
就会往集合中添加值EUR和USD
试试吧,万一能呢