Dagger2详解
概述:
1:Dagger2是编译时完成注入,没有采用反射,采用的是APT技术。
2:当我们需要对一段代码进行拦截修改的时候,我们有很多方案,最常见的是通过反射。但是反射是在运行时的工作,对性能有很大的影响,所以提出了APT技术,该技术可以在编译期对代码进行拦截,并进行修改,生成新的可执行的类。
https://blog.csdn.net/BunnyCoffer/article/details/108582624
APT:用法:
https://blog.csdn.net/lvkaixuan/article/details/119784291
3:
我们知道在一个类中,通常会定义其他类型的变量,这个变量就是我们所说的“依赖“。
对一个类的变量进行初始化,有两种方式。第一种,这个类自己进行初始化;第二种,其他外部的类帮你进行初始化。
其中第二种方式,由外部类进行初始化的方式就是我们所说的”依赖注入“。由于他是由外部来控制,因此又叫做”控制反转“。依赖注入和非依赖注入的区别就是,变量初始化工作是由谁来做的。我们常用的工厂、建造者、带参数的构造函数,都是依赖注入。而Dagger2的定位就是提供了用注解的方式来配置依赖的方法。因此Dagger并不是提供依赖注入的能力,而是为依赖注入提供一种更简单的方法
https://blog.csdn.net/m0_69650487/article/details/128817597
用法:
1:定义一个需要使用的类:
public class HttpObject { }
2:定义一个Module,生成HttpObject的实例:
@Module public class HttpModule { @Provides public HttpObject provideHttpObject() { return new HttpObject(); } }
3:定义一个Component,包裹上述的Module:
@Component(modules = {HttpModule.class, DatabaseModule.class}) public interface MyComponent { void injectMainActivity(MainActivity mainActivity); }
4:使用:
public class MainActivity extends AppCompatActivity { @Inject HttpObject httpObject; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaggerMyComponent.create().injectMainActivity(this); Log.i("test--->", String.valueOf(httpObject.hashCode())); }