Для решения этой проблемы существует модуль с именем File :: ShareDir . Вы были на правильном пути, пытаясь найти FindBin, но FindBin всегда находит запущенную программу , а не модуль, который ее использует. ShareDir делает что-то очень похожее на решение ysth, за исключением завершенного в приятном интерфейсе.
Использование так же просто, как
my $filename = File::ShareDir::module_file(__PACKAGE__,
'my/data.txt');
# and then open $filename or whatever else.
или
my $dirname = File::ShareDir::module_dir(__PACKAGE__);
# Play ball!
Сначала вам нужно аннотировать конструктор для SomeClass
:
class SomeClass {
@Inject
SomeClass(@Named("JDBC URL") String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
}
Я предпочитаю использовать пользовательские аннотации, например:
class SomeClass {
@Inject
SomeClass(@JdbcUrl String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface JdbcUrl {}
}
Затем вам нужно предоставить привязку в ваш модуль:
public class SomeModule extends AbstractModule {
private final String jdbcUrl; // set in constructor
protected void configure() {
bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
}
}
Затем, когда Guice создает SomeClass, он вводит параметр. Например, если SomeOtherClass зависит от SomeClass:
class SomeOtherClass {
@Inject
SomeOtherClass(SomeClass someClass) {
this.someClass = someClass;
}
Часто, когда вы думаете, что хотите ввести String, вы хотите внедрить объект. Например, если String является URL-адресом, я часто вставляю URI с аннотацией привязки.
Все это предполагает наличие некоторого постоянного значения, которое вы можете определить во время создания модуля для String. Если значение недоступно во время создания модуля, вы можете использовать AssistedInject .
Я нахожу решение в разделе часто задаваемых вопросов Guice:
http://code.google.com/docreader/#p=google-guice&s=google-guice&t=FrequentlyAskedQuestions
В дополнение к определению аннотации и атрибута String в MyModule, мне нужно написать строку ниже, чтобы получить экземпляр SomeClass:
SomeClass instance = Guice.createInjector(new MyModule("any string i like to use")).getInstance(SomeClass.class);
Но я вспомнил этот Инжектор. getInstance () не должен использоваться, кроме корневого объекта, так есть ли лучший способ сделать это?