我正在编写一个maven插件,根据我以前的经验,我知道我的mojo类最终会有一堆@Parameter
s来配置它。我想要做的是不是将这些配置参数注入mojo类中,我想将它们注入第二个仅配置类中。这可能吗?
我现在这样做的方法是mojo类只构造一个Configuration对象,它传递所有注入的参数。像这样的东西
@Mojo
public class MyMojo extends AbstractMojo {
private MyConfig myConfig;
@Parameter
private String myArg1;
...
public void execute() {
myConfig = new MyConfig(myArg1, myArg2, ...);
}
}
但这很难看。我希望DI直接在Config中发生
如果MyConfig是pojo,你可以在这里使用@Parameter
,但是,你的配置看起来像:
<configuration>
<myConfig>
<someField>value</someField>
</myConfig>
</configuration>
第二个技巧是使用setter,因为@ Parameter-annotated字段将使用匹配的公共setter(如果有的话)。
private MyConfig myConfig = new MyConfig();
@Parameter
private String someField;
// matching setter for @parameter-annotated field
public void setSomeField( String field )
{
myConfig.setSomeField( field );
}
您可以使用MyConfig
POJO作为@Parameter
:
@Mojo
public class MyMojo extends AbstractMojo {
@Parameter
private MyConfig myConfig;
...
}
映射复杂对象的规则如下:
- 必须有一个私有字段,该字段对应于要映射的元素的名称。所以在我们的例子中,
person
元素必须映射到mojo中的person
字段。- 实例化的对象必须与Mojo本身位于同一个包中。因此,如果你的mojo在
com.mycompany.mojo.query
中,那么映射机制将在该包中查找名为Person
的对象。如您所见,该机制将大写元素名称的第一个字母,并使用它来搜索要实例化的对象。
但是,使用@Parameter
用于MyConfig
的字段没有效果,请参阅this thread。