介绍:
1.依赖注入:面向对象编程的一种设计模式,目的是降低类之间的依赖耦合。
2.问题场景:
a.在类中直接创建另一个类的实例,违背了单一原则。
b.在构造函数中传入另一个类的实例作为参数,违背了开闭原则。
3.注入方式:
a.接口注入
b.通过set方法注入
c.通过构造方法注入
d.通过java 注解(Dragger实现方式)
依赖
//Dagger
compile 'com.google.dagger:dagger:2.4'
//java注解
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
使用方式:
示例区别:构造函数是否添加@Inject
一:实例化对象,构造函数无参数(无module)
涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass
说明:
1.非private 对象,通过@Inject 标注
2.构造函数添加@Inject
3.添加component,添加inject()方法,标注注入点
public class DaggerActivity extends Activity {
@Inject
protected DaggerClass mDaggerClass;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerDaggerActivityComponent.builder().build().inject(this);
//可直接调用~~~
mDaggerClass.ObjectTest();
}
}
@Component
public interface DaggerActivityComponent {
void inject(DaggerActivity view);
}
public class DaggerClass {
@Inject
public DaggerClass() {
}
public void ObjectTest() {
Log.i("lyw", "ObjectTest");
}
}
二:实例化对象,构造函数无参数(使用module)
使用场景:第三方库对象的提供 (没有源码的情况下,无法为构造函数添加@Inject)
涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass、DaggerModule
说明
1.去除DaggerClass 构造函数 注解
2.添加DaggerModule
3.DaggerActivityComponent 配置DaggerModule 类
4.DaggerActivity 中添加关联DaggerModule
public class DaggerActivity extends Activity {
@Inject
protected DaggerClass mDaggerClass;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerDaggerActivityComponent.builder().daggerModule(new DaggerModule()).build().inject(this);
//可直接调用~~~
mDaggerClass.ObjectTest();
}
}
@Component(modules = {DaggerModule.class})
public interface DaggerActivityComponent {
void inject(DaggerActivity view);
}
public class DaggerClass {
public DaggerClass() {
}
public void ObjectTest() {
Log.i("lyw", "ObjectTest");
}
}
@Module
public class DaggerModule {
@Provides
public DaggerClass provideDaggerClass() {
return new DaggerClass();
}
}
三:实例化对象,构造函数有相同类型参数(使用module)
第二种写法升级版
涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass、DaggerModule
说明
1.修改DaggerClass
2.修改DaggerModule
public class DaggerActivity extends Activity {
@Inject
protected DaggerClass mDaggerClass;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerDaggerActivityComponent.builder().daggerModule(new DaggerModule("lyw", "28")).build().inject(this);
//可直接调用~~~
mDaggerClass.ObjectTest();
}
}
@Component(modules = {DaggerModule.class})
public interface DaggerActivityComponent {
void inject(DaggerActivity view);
}
public class DaggerClass {
private String mName, mAge;
public DaggerClass(String name, String age) {
mName = name;
mAge = age;
}
public void ObjectTest() {
Log.i("lyw", "mName:" + mName + ",mAge:" + mAge);
}
}
@Module
public class DaggerModule {
private String mTag1;
private String mTag2;
public DaggerModule(String tag1, String tag2) {
mTag1 = tag1;
mTag2 = tag2;
}
@Provides
public DaggerClass provideDaggerClass() {
return new DaggerClass(mTag1, mTag2);
}
}
四:实例化对象,构造函数有相同类型参数(使用module--使用限定符,高逼格写法)
第一种写法升级版
涉及类:DaggerActivity、DaggerActivityComponent、DaggerClass、DaggerModule、DaggerUserInfo
说明
1.增加注解类:DaggerUserInfo
2.修改DaggerClass
3.修改DaggerModule
@Retention(RUNTIME)
@Documented
@Qualifier
public @interface DaggerUserInfo {
String value() default "";
}
public class DaggerClass {
private String mName, mAge;
@Inject
public DaggerClass(@DaggerUserInfo("name") String name, @DaggerUserInfo("age") String age) {
mName = name;
mAge = age;
}
public void ObjectTest() {
Log.i("lyw", "mName:" + mName + ",mAge:" + mAge);
}
}
@Module
public class DaggerModule {
private String mName;
private String mAge;
public DaggerModule(String name, String age) {
mName = name;
mAge = age;
}
@Provides
@DaggerUserInfo("name")
public String provideName() {
return mName;
}
@DaggerUserInfo("age")
@Provides
public String provideAge() {
return mAge;
}
}
其实,第四种装逼写法,可以使用@Name(""),只不过,@Name 默认是String,按需定制吧。
网友评论