dagger与spring注解对比
功能 | spring | dagger |
依赖提供 |
@Component |
@Inject(javax) @Module @Provide |
注入对象 |
@Resource(javax) @Autowired |
@Component |
Dagger介绍:
Dagger是一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护的然后现在把这堆东西扔给Google维护了。
Dagger解决了基于反射带来的开发和性能上的问题(因为Dagger并没有用反射来做依赖注入)
实现:被标注了Component的接口在编译时会产生相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁,把相关依赖注入到其中
@Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用,从而提供依赖,(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)
另一个作用就是标记在需要依赖的变量让Dagger2为其提供依赖。
@Provide 用Provide来标注一个方法,该方法可以在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Injection的变量赋值。provide主要用于标注Module里的方法 @Module 用Module标注的类是专门用来提供依赖的。有的人可能有些疑惑,看了上面的@Inject,需要在构造函数上标记才能提供依赖,那么如果我们需要提供的类构造函数无法修改怎么办,比如一些jar包里的类,我们无法修改源码。
这时候就需要使用Module了。Module可以给不能修改源码的类提供依赖,当然,能用Inject标注的通过Module也可以提供依赖 @Component Component一般用来标注接口,被标注了Component的接口在编译时会产生相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁,把相关依赖注入到其中
示例代码:
import javax.inject.Inject;
public class Computer {
@Inject
Display display;
@Inject
Keyboard keyboard;
@Inject
Master master;
@Inject
String providerStringtaste;
public Computer() {
// DaggerComputerComponent.create();
//ComputerComponent daggerComputerComponent =
DaggerComputerComponent.builder().computerModule(new ComputerModule("中国", providerStringtaste)).build().inject2(this);
// keyboard = daggerComputerComponent.ProvidekeyBoard();
// display = daggerComputerComponent.sprovideDisplay();
// master = daggerComputerComponent.provideMaster();
//DaggerComputerComponent.builder().computerModule(new ComputerModule("中国","联想")).build().inject(this);
makeComputer(keyboard, display, master);
}
private void makeComputer(Keyboard keyboard, Display display, Master master) {
System.out.println("制造完成。keyboard:"+keyboard +",display:"+ display + ", master:"+ master);
}
public static void main(String[] args) {
new Computer();
}
}
import dagger.Component; @Component(modules = {ComputerModule.class})//指明要在那些Module里寻找依赖 public interface ComputerComponent { //注意:下面这三个方法,返回值必须是从上面指定的依赖库SaladModule.class中取得的对象 //注意:而方法名不一致也行,但是方便阅读,建议一致,因为它主要是根据返回值类型来找依赖的 //★注意:下面这三个方法也可以不写,但是如果要写,就按照这个格式来 //但是当Component要被别的Component依赖时, //这里就必须写这个方法,不写代表不向别的Component暴露此依赖 Display sprovideDisplay(); Keyboard ProvidekeyBoard(); Master provideMaster(); //注意:下面的这个方法,表示要将以上的三个依赖注入到某个类中 //这里我们把上面的三个依赖注入到Computer中 void inject1(Computer computer); void inject2(Computer computer); }
import dagger.Provides; import dagger.Module; import javax.inject.Named; @Module public class ComputerModule { private String from; private String taste; @Provides public Display providerDisplay() { return new Display(); } @Provides public String providerString() { return from; } @Named("taste") @Provides public String providerStringtaste() { return "联想1"; } public ComputerModule() { } public ComputerModule(String from, String taste) { this.from = from; this.taste = taste; } @Provides public Keyboard providerkeyboardFrom(String from) { return new Keyboard(from); } }
Master,Keyboard,Display源码:
public class Display { private static final String TAG = "Display"; public Display() { // Log.d(TAG, "Display() called"); System.out.println("这是个显示器"); } }
public class Keyboard { private static final String TAG = "keyboard"; private String from; public Keyboard() { System.out.println("这是键盘"); } public Keyboard(String from) { this.from = from; System.out.println("这是产自" + from + "的键盘"); } public String toString(){ return (from + "的键盘"); } }
import javax.inject.Inject; import javax.inject.Named; public class Master { public Master() { } @Inject public Master(@Named("taste") String string) { System.out.println("这是" + string + "Master"); } }
引用:https://blog.csdn.net/a15286856575/article/details/53156774