我阅读了匕首2文档,但仍然无法找到在我的应用程序中应该使用dagger2的条件,以及它的实现有哪些好处?
答案 0 :(得分:0)
1。)要使用Dagger2,您需要将其作为项目中的依赖项包含在内。
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
compile 'com.google.dagger:dagger:2.9'
provided 'org.glassfish:javax.annotation:10.0-b28'
然后你可以使用Dagger2。
2。)每当你有一个类是另一个类的依赖时。
所以,如果你有这样的事情:
public int getNewRandomNumber() {
return new Random().nextInt(5000);
}
然后你对Random
有一个隐含的依赖,而且它不可模仿。
因此,您可能希望将此作为方法的依赖项提供:
public int getNewRandomNumber(Random random) {
return random.nextInt(5000);
}
但是你可能在很多地方使用Random
,所以你可能想把它提供给类本身:
public class RandomGenerator {
private final Random random;
public RandomGenerator(Random random) {
this.random = random;
}
}
之后问题浮出水面:如果您需要RandomGenerator
的实例,您从哪里获得Random
?
当然这是愚蠢的:
RandomGenerator gen = new RandomGenerator(new Random());
这样做会不会更好:
RandomGenerator randomGenerator = component.randomGenerator();
或
@Inject
RandomGenerator randomGenerator;
显然,与Dagger相比,这很容易
@Module
public class RandomModule {
@Provides
@Singleton
Random random() {
return new Random();
}
}
@Singleton
@Component(modules={RandomModule.class})
public interface SingletonComponent {
Random random();
RandomGenerator randomGenerator();
}
然后
@Singleton
public class RandomGenerator {
private final Random random;
@Inject
public RandomGenerator(Random random) {
this.random = random;
}
}
或
@Singleton
public class RandomGenerator {
@Inject
Random random;
@Inject
public RandomGenerator() {
}
}
您可以阅读有关依赖注入here
的更多信息