Dagger2使用中的核心技巧包括@Subcomponent和@Scope,这两个注解对架构的层次关系有非常重要的作用。...这时候就需要结合@Subcomponent 来一起理解这两个东西了。...来拆分层级 在不使用@Subcomponent的情况下修改之前的代码 我们回到之前CoffeeMachine的例子。...在定义了Subcomponent之后,它是怎么跟Parent Compoenent联系起来的呢?...这里扯个题外话,在Dagger1的时候,并没有@Subcomponent注解,它是用depenencies来表明Subcomponent的。
interface Builder { // SubComponent 必须显式地声明 Subcomponent.Builder,parent Component 需要用 Builder 来创建...SubComponent SonComponent build(); } } @SubComponent的写法与@Component一样,只能标注接口或抽象类,与依赖关系一样,...SubComponent 与 parent Component 的 Scope 不能相同,只是 SubComponent 表明它是继承扩展某 Component 的。...只需要在 parent Component 依赖的 Module 中的subcomponents加上 SubComponent 的 class,然后就可以在 parent Component 中请求 SubComponent.Builder...的 class;(2)在 parent Component 中提供返回 SubComponent.Builder 的接口用以创建 SubComponent 7、@BindsInstance的使用
Component接口的复用 Hello world ---- 我们可以适当地复用Component接口,从而使逻辑更加简洁且减少不必要的重复工作,复用一般使用dependencies或者@Subcomponent...的方法 } 实现SubComponent ?...@Subcomponent (modules = FruitModule.class) //这里的@Subcomponent表示这是一个SubComponent接口 public interface...而使用@SubComponent不需要暴露类,而需要直接提供一个获取SubComponent的方法。...@SubComponent适用于父Component中公共注入类较多且不用隐藏的场景。
使用子组件 通过import SubComponent from '..../SubComponent'来引用子组件SubComponent,在 render方法中注册使用组件 render(){ return( )...} 绑定ref属性 在子组件调用上面绑定一个值为subcomponents的属性ref,subcomponents 调用子组件方法...在入口父组件App.js中,添加方法handleClick,去调用子组件SubComponent.js中的subHandleClick方法 handleClick(){ //this.refs.subcomponents...import React, { Component } from 'react'; export default class SubComponent extends Component { constructor
新建一个接口使用 @Subcomponent 注解继承 AndroidInjector<YourActivity ,内部抽象类使用 @Subcomponent.Builder 注解继承AndroidInjector.Builder...@Subcomponent(modules = arrayOf(...)) // 没有其他 Module 圆括号可省略 interface YourActivitySub : AndroidInjector...<YourActivity { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<YourActivity...在 Dagger2 2.11 版本之前,项目中每添加一个 Activity 或 Fragment 等组件,都要新建一个对应 Subcomponent 接口,并添加到对应的 Module 中,并且添加相应的方法...@ContributesAndroidInjector 注解自动生成对应的 Subcomponent 而不需要我们手动添加。
首先编写实现AndroidInjector 的@Subcomponent,并使用扩展AndroidInjector.Builder 的@ Subcomponent.Builder: @Subcomponent...Component(modules = {..., YourActivityModule.class}) interface YourApplicationComponent {} 专业提示:如果你的 subcomponent...@ActivityScope @ContributesAndroidInjector(modules = { /* modules to install into the subcomponent */...以相同的方式定义 subcomponent,将 Activity 类型参数替换为 Fragment,将 @ActivityKey 替换为 @FragmentKey,将 HasActivityInjector...所有每个子类需要做的是绑定相应的 @Subcomponent。 如果您没有复杂的类层次结构,Dagger提供了一些基本类型,例如DaggerActivity和 DaggerFragment。
可以使用,Subcomponent又可以被添加到Component中 2.1 定义新的作用域:SubScope @Scope @Retention(AnnotationRetention.SOURCE)...注解定义子组件,并指定作用域为SubScope @SubScope @Subcomponent interface SubComponent { } 2.4 在子组件中使用@Subcomponent.Factory...注解,定义获取该组件的接口 同时在子组件中提供注入方法,这边我新建了一个SubActivity @SubScope @Subcomponent interface SubComponent {...@Subcomponent.Factory interface Factory { fun create(): SubComponent } fun inject...(activity: SubActivity) } 2.5 提供给组件一个子组件module 在Moudle注解中,指定使用哪个子组件 @Module(subcomponents = [SubComponent
"> this is SubComponent1{{param.name}} this is SubComponent2{{param.name}} this is SubComponent3{{param.name}} </SubComponent3...},inlineTemplate:{render:function(){with(this){return _c('p',[_v("this is SubComponent2"+_s(param.name...function anonymous() { with(this){return _c('ParentComponent', [ __SubComponent1_replace__, __SubComponent2
){ printf("-----Dean Office:%s\n", name.c_str()); } private: string name; }; 3.3.容器构件 //容器构件SubComponent...class SubComponent :public Component { public: SubComponent(string iName){ this->name = iName;...*office1, *office2, *office3, *office4, *office5, *office6, *office7, *office8; head = new SubComponent...("总部"); sichuanBranch = new SubComponent("四川分部"); office1 = new AdminOffice("行政办公室"); office2 =...new DeanOffice("教务办公室"); cdBranch = new SubComponent("成都分部"); myBranch = new SubComponent("绵阳分部
/defaultProps'; // 属性转化成表单 哪个属性使用哪个类型的组件去编辑 export interface PropsToForm { component: string; subComponent...afterTransform: (e: number) => e.toString(), }, textAlign: { component: 'a-radio-group', subComponent...afterTransform: (e: any) => e.target.value, }, fontFamily: { component: 'a-select', subComponent...使用的组件 export const mapPropsToForms: PropsToForms = { fontFamily: { component: 'a-select', subComponent...component"> <component :is="item.<em>subComponent</em>" v-for
---- 注解 @Qualifier: 要作用是用来区分不同对象实例 @Named 其实是@Qualifier的一种实现 Scope Subcomponent Lazy与Provider @Qualifier...clipboardd.png ---- @Subcomponent 作用有些类似Component中的dependencies作用。...特点: Subcomponent同时具备两种不同生命周期的scope, SubComponent具备了父Component拥有的Scope,也具备了自己的Scope。...SubComponent的Scope范围小于父Component 我们用代码使用体会下: FComponent //第一步 @Module public class FModule { @Singleton...; } } //第二步 @Singleton @Component(modules = FModule.class) public interface FComponent { //需要将SubComponent
SubComponent 事实上,到这里dagger的用法对于服务端来说已经足够了。通过module的连接特性可以定义IoC容器范围,再结合dropwizard,就和springboot一样了。...然而,毕竟dagger2是为了Android而打造的,为了适应其复杂的继承体系和生命周期的限制,dagger提供了SubComponent模型。也就是子组件。...对于Subcomponent的作用,大概有两点: 1)继承扩展功能并绑定生命周期,2)封装。 继承体现在subcomponent可以使用parent的module,共享其生命周期。...封装则是因为但其他人都不可以使用subcomponent的依赖,只能使用subcomponent本身。也就是parent里的Component不能调用subcomponent里的module。...暂时没能理解subcomponent和scope的使用,感觉有些复杂。
@Subcomponent是复用组件,我们想复用组件时,可以使用它,下面是父组件使用方法。另一种是注解属性添加dependencies。...--->子类:给UserComponent添加UserModule依赖 @Subcomponent(modules = { UserModule.class }) public interface
: { [key: string]: any }; text: string; // 支持组件包裹 subComponent?...initalTransform: (v: string) => parseFloat(v), }, textAlign: { component: 'a-radio-group', subComponent...value: 'right', text: '右', }, ], }, fontFamily: { component: 'a-select', subComponent...-- 判断有没有包裹子组件 --> <component :is="item.<em>subComponent</em>
@SubComponent:如果我们需要父组件全部的提供对象,这时我们可以用包含方式而不是用依赖方式,相比于依赖方式,包含方式不需要父组件显式显露对象,就可以拿到父组件全部对象。...且SubComponent只需要在父Component接口中声明就可以了。...包含方式——这里就用到了我们@SubComponent注解,用@SubComponent标记接口或者抽象类,表示它可以被包含。...//包含SubComponent ActSubComponent getActSubComponent(); 上面的ActSubComponent 是被包含,它需要有个@Subcomponent...然后我们在Activity内部的Fragment可以拿到对应的这个SubComponent。 ?
@Subcomponent Subcomponent即子组件,可以将父组件的能力继承过来,同时扩展自己的能力。...现在已经有了@Component的CarGraph来造车,我们可以建一个@Subcomponent的WheelGraph来造轮胎,(虽是轮胎图纸,但也有造车之心) @Subcomponent //子组件...,轮胎图纸 public interface WheelGraph { Wheel makeWheel(); //造轮胎 @Subcomponent.Factory //告知CarGraph...create(); //造轮胎 Wheel wheel = wheelGraph.makeWheel(); 然后我们看下子组件是如何使用父组件的能力的,在WheelGraph里添加一个inject, @Subcomponent...表示我想要一个Activity级别的作用域 } 使用, @ActivityScope //使用自定义注解 public class Wheel { } @ActivityScope //使用自定义注解 @Subcomponent
onHandleClick = useCallback(() => { const special = calculatePi(); }); return ( <SubComponent...handleClick={onHandleClick} /> ); } In this example, each time the <SubComponent
com.google.dagger:hilt-android-compiler:2.28-alpha" } Application类 使用Dagger时,需要一个AppComponent单例组件,项目中的其它SubComponent...Android类 对于Android类,使用Dagger时需要定义SubComponent并将它依赖到Application类中。下面以WelcomeActivity为例。...@Subcomponent(modules = [WelcomeModule::class]) interface WelcomeComponent { @Subcomponent.Factory
的作用是引用 Module 的,下面 @Module 会继续说 dependencies 的作用是 引用其他 Component 使用的,相当于 把其他的 Component 当作组件一样引用过来; @SubComponent...Dagger2 不会生成 Dagger开头的 DaggerSubComponent 这种类,所以,SubComponent 需要在 Component 注册和维护。...@ActivityScoped @Subcomponent(modules = MainModule.class) public interface MainComponent { void...SecondActivity: onCreate: dbmanager-singleton->64826129 总结 : Dagger2 实现单例要 @Singleton 和 @Component || @SubComponent...; SecondComponent plus(SecondModule module); DBManager getDBManager(); } @ActivityScoped @Subcomponent
领取专属 10元无门槛券
手把手带您无忧上云