在前一篇 Daager2-初認識一 中咱們認識了簡單的Dagger2的使用和依賴注入的優勢,這章繼續深刻的研究和學習Dagger2
的使用,後續會結合mvp
主流框架給你們一步步講解如何運用dagger2封裝大項目的開發框架!html
Daager2-初認識一java
上一節咱們講解了moudel的依賴方法,其實Component也能夠提供依賴實現以下:緩存
public class Info {
private String msg;
}複製代碼
@Module
public class InfoModule {
private String name;
public InfoModule(String name) {
this.name = name;
}
@Provides
Info provideInfo(){
return new Info(name);
}
}複製代碼
由於InfoComponent 不須要注入activity使用,因此不用寫對應的inject方法,直接提供Info 回調便可框架
@Component(modules = {InfoModule.class})
public interface InfoComponent {
Info infoMoudule();
}複製代碼
對比ide
@Component(modules = UserModule.class)
public interface UserComponent {
void inject(MainActivity mainActivity);
}複製代碼
使用dependencies 標識依賴Component 對象post
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
void inject(MainActivity mainActivity);
}複製代碼
和以前注入方法同樣,不過這裏多出了infoComponent方法(自動生成)提供component依賴,成功之後咱們能夠@Inject獲得一個Info 對象學習
public class MainActivity extends AppCompatActivity {
@Inject
User user;
@Inject
Info info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InfoComponent infoComponent= DaggerInfoComponent.builder().infoModule(new InfoModule("AAAAA")).build();
UserComponent component= DaggerUserComponent.builder().userModule(new UserModule()).infoComponent(infoComponent).build();
component.inject(this);
TextView textView=(TextView)findViewById(R.id.tv);
textView.setText("name:"+user.getName()+"\nsex:"+user.getSex()+"\nads:"+user.getAds()+"\ninfo->>>"+info.getMsg());
}
}複製代碼
到目前爲止咱們已經學習了兩種依賴方式一種是moudel一種是component,基本已經知足了平常的使用,接下來咱們提高學習一些更加有用的註解方法ui
Scopes但是很是的有用,Dagger2能夠經過自定義註解限定註解做用域;其實這裏就是生命週期的 意思,咱們能夠經過@Scopes類定義一個componet或者module的生命週期,好比咱們須要讓依賴的對象和咱們的activity生命週期同樣,自動銷燬this
經過@Scope咱們定義了一個@interface PerApp註解,經過這個註解咱們能夠標示一個對象的生命週期!spa
@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp {
}複製代碼
運用:
@PerApp
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
void inject(MainActivity mainActivity);
}複製代碼
@Singleton標示當前方法和對象是單利模式
@PerApp
@Singleton
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
void inject(MainActivity mainActivity);
}複製代碼
@Module
public class UserModule {
@Provides
@Singleton
User provideUser(){
return new User("xxxx","SEX","XXX@Gmail.com");
}
}複製代碼
經過兩章基礎學習,咱們已經掌握了dagger2的基本用法,在此基礎上已經能夠自由擴展咱們的框架了;好比如今要封裝一個這樣的框架:咱們經過dagger2依賴去構建一個component依賴,提供了全局的開發中的公用對象:圖片管理器;緩存;服務;http請求..............
咱們能夠經過component依賴注入到須要使用的activity中,實現dagger2全局依賴的效果!
大體結構
@Singleton
@Component(modules = {AppModule.class, ClientModule.class, ServiceModule.class, ImageModule.class, CacheModule.class})
public interface AppComponent {
Application Application();
//服務管理器,retrofitApi
ServiceManager serviceManager();
//緩存管理器
CacheManager cacheManager();
//Rxjava錯誤處理管理類
RxErrorHandler rxErrorHandler();
//用於請求權限,適配6.0的權限管理
RxPermissions rxPermissions();
OkHttpClient okHttpClient();
//圖片管理器,用於加載圖片的管理類,默認使用glide,使用策略模式,可替換框架
ImageLoader imageLoader();
//gson
Gson gson();
}複製代碼
你們能夠自由想象,自由設計,趕忙將dagger2運用到你的項目中吧!裝逼開始了