Lombok和Guice注入

10

我对lombok和guice注入还很陌生,虽然了解了一般的概念,但我遇到了一些代码,由于语法问题无法搜索,也不理解,请问有人可以帮助我理解吗?下面是代码:

import com.google.inject.Inject;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE, onConstructor = @__({ @Inject }))
public class SomeClass {
...
}

谢谢!

2个回答

11
这将添加一个包含所有字段作为参数的构造函数,带有@Inject注释和private修饰符,因此您的代码将扩展为:
import com.google.inject.Inject;

public class SomeClass {
    
    @Inject
    private SomeClass() {
    }
}

假设该类中没有字段。如果有一些字段,则它们将被添加到构造函数中,例如:
import com.google.inject.Inject;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;

@AllArgsConstructor(access = AccessLevel.PRIVATE, onConstructor = @__({ @Inject }))
public class SomeClass {
    private String name;
}

将变成:

import com.google.inject.Inject;

public class SomeClass {
    private String name        

    @Inject
    private SomeClass(String name) {
        this.name = name;
    }
}

请注意,无论如何在Guice中都不起作用,因为它需要一个非私有的构造函数,详见此文档

4
请注意,无论如何在Guice中这都行不通,因为它需要一个非私有的构造函数。但是如果构造函数有@Inject注释,那么Guice将可以很好地处理它,只是AOP将不起作用。 - Tavian Barnes

0

同时确保Lombok保留您添加的任何@Named注释!

否则,例如下面的代码将无法注入:

@AllArgsConstructor(access = AccessLevel.PACKAGE, onConstructor = @__({@Inject}))
public class SomeClass {
    @Named("example")
    private String exampleString;
}

public class ExampleModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(String.class)
          .annotatedWith(Names.named("example"))
          .toInstance("Hello, world!");
    }
}

看这个答案:Lombok保留字段。你想要添加
lombok.copyableAnnotations += com.google.inject.name.Named

to your lombok.config file.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接