编程语言
首页 > 编程语言> > java – 如何在Guice注入中提供参数,同时不破坏Guice-AOP方法拦截?

java – 如何在Guice注入中提供参数,同时不破坏Guice-AOP方法拦截?

作者:互联网

我有一种情况,我需要使用Guice 3.0来实例化我的对象,但其中一个值可能会随每个实例而改变.我无法绑定该值的类型,直到我需要创建实例时才会知道.

例如:

public class Foo {
    public Foo(Bar bar, Baz baz) {...}
}

我希望Guice注入Bar param,但在我需要Foo之前​​我不会知道Baz.该值也不是特定于范围的(例如RequestScope).

我希望Guice完全实例化这个对象的全部原因是因为我需要方法拦截.在Guice中,“手动构造的实例不参与AOP”.

我试图通过Provider< Foo>做到这一点.但这只允许我公开Foo get(){…}.

如果必须为Baz的每个可能值创建一个提供程序,那将是一个配置噩梦,所以我不能简单地在FooProvider的构造函数中定义Baz.

我觉得我在这里缺少一些基本的东西.也许是因为这是我在星期五做的最后一件事.任何想法,将不胜感激.

编辑:下面的答案使用“辅助注射”似乎只有你能够编辑Foo的来源才有效.在某些情况下,Foo实际上可能无法控制.如果我自己创建实例(即实现我自己的工厂),那么Guice-AOP方法拦截器似乎并不知道该对象.

解决方法:

看起来“辅助注射”可能是一个解决方案:

http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/assistedinject/FactoryModuleBuilder.html

如果您无权访问Foo的构造函数,则它不起作用.

编辑:我发现我可以通过扩展类型并将它们添加到我想要使用的构造函数中来添加辅助注入注释:

public class AssistedFoo extends Foo {
    @AssistedInject
    public AssistedFoo(
        Bar bar,
        @Assisted Baz baz) {
        super(bar, baz);
    }
}

然后在辅助注射注册中使用此扩展实现:

public interface FooFactory {
    Foo create(Baz baz);
}

//...

install(new FactoryModuleBuilder()
    .implement(Foo.class, AssistedFoo.class)
    .build(FooFactory.class));

只有在您无权更改Foo时才需要额外的继承类.显然,如果课程是最终的,这种解决方法是行不通的.

标签:java,guice,aop,factory-pattern
来源: https://codeday.me/bug/20190903/1794648.html