关于“ConnectionString 属性尚未初始化”的问题(如下图), 我在下面一段代码中发现了问题所在: public bool ReturnFlag(string strSQL)...cnn.Dispose(); } 问题就出在标红的代码上,cnn.dispose() 释放con对象所占用的资源,释放后这个对象就不可用了,所以出现“ConnectionString 属性尚未初始化
() : this("Tom") } 标记属性 被标记的属性不能是final的,kotlin中不能是val。...被注入进的属性不能用private修饰(是Dagger2不支持,而非@Inject不支持)。...@Inject lateinit var people:People 标记方法 被标记的方法可以有0个或多个依赖作为参数。 方法不能是抽象的。...: AppCompatActivity() { @Inject lateinit var people: People @Inject lateinit var people_2: People...上面提到这只是一个局部单例,那么怎么实现一个全局单例呢,很简单,只要保证标记的Component在全局只初始化一次即可,比如在Application中初始化,篇幅限制代码就不贴了,有兴趣的骚年可以自己实践一下
附图一张: 错误提示:ConnectionString属性尚未初始化。因为它的出现让我再次开始了1小时多的百度之旅,查查查!下面 就总结一下这个问题。...分析: 属性尚未初始化,说明在使用它之前没有给它赋值。 第一步.首先我们可以断点调试,看看是否给它赋值,在实践之后发现结果如下: 第二步....Public Sub New() Conn = New SqlConnection End Sub 正确示例: 第一种:在定义Conn时,就直接初始化它
延迟初始化属性 lateinit I ....延迟初始化属性 lateinit ---- 1 ....属性不能有初始化器 : lateinit 修饰的数据类型不能定义初始化器 , 报错信息 'lateinit' modifier is not allowed on properties with initializer...延迟初始化属性为空 : 如果在没有初始化属性值时 , 调用该 lateinit 延迟初始化属性 , 会抛出异常 ; 6 . lateinit 延迟初始化属性推荐示例 : class Student {...//在类中定义 //不要定义 属性初始化器 //不要定义 getter setter 属性访问器 lateinit var name : String }
文章目录 一、lateinit 延迟初始化 ( ::属性名称.isInitialized 检查属性是否初始化 ) 二、lazy 惰性初始化 一、lateinit 延迟初始化 ( ::属性名称.isInitialized...检查属性是否初始化 ) ---- 在定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 在 实例对象 创建时不进行初始化 , 在使用该属性之前对其进行初始化即可 ; 对于...lateinit 延迟初始化 的属性 , 在使用前可以执行 ::属性名称.isInitialized 检查 , 查看该属性是否进行了初始化操作 ; 代码示例 : class Hello{ lateinit...name 属性值为 Tom 二、lazy 惰性初始化 ---- lazy 惰性初始化 的 属性初始化操作 是 提前定义好的 , 在 调用之前 自动进行初始化操作 , 如果不调用 , 则不进行初始化...; lateinit 延迟初始化 的 属性初始化操作 , 需要 手动进行初始化 , 如果忘了初始化直接调用就会报错 ; 代码示例 : class Hello{ val name by lazy
1. dagger2的@Named,无法使用 在Kotlin使用Dagger2的时候,因为用@Module标注的类里面有返回两个类型一样的方法,需要用@Named来分开标注,不然,会build的时候报错...然后用到的地方用@Inject@Named("example1")来标注。就完成依赖了。可是到了kotlin发现空指针,没有依赖成功。我又试了一下@Qualifier自定义一个注解。...解决方法: 然后在dagger2的issue里面提到@Named配合@Inject要这样子用@Inject @field:Named("example1"),同理你也可以用@field:FS来标记,也是成功的...@field:Named("fs") lateinit var city: City 方法二: //BeanModule.kt @FS @Provides fun showCityFS():...:FS lateinit var city: City
Dagger2是什么? Dagger2是一款基于Java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。...一、Kotlin Dagger2 配置 build.gradle apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply...//dagger2 compile rootProject.ext.dependencies["dagger"] kapt rootProject.ext.apt["dagger-compiler..."] //dagger2 android 一个dagger2 关于Android的增强库 可选项 compile rootProject.ext.dependencies["dagger-android...= null //或则 @Inject lateinit mPresenter : MainContract.Presenter 即可编译成功 坑2 @Inject @JvmField // @Named
首先lateinit是Kotlin中的关键字,和Hilt无关。...这个关键字用于对变量延迟初始化,因为Kotlin默认在声明一个变量时就要对其进行初始化,而这里我们并不想手动初始化,所以要加上lateinit。如果你是用Java开发的话,那么可以无视这个关键字。...根据刚才已学到的知识,最直观的写法就是这样: class Truck @Inject constructor(val driver: Driver) { @Inject lateinit...@Inject lateinit var gasEngine: Engine @BindElectricEngine @Inject lateinit var electricEngine...如果你比较了解ContentProvider的话,应该知道它的生命周期是比较特殊的,它在Application的onCreate()方法之前就能得到执行,因此很多人会利用这个特性去进行提前初始化,详见
,下面都会用目标类一词来指代)中所依赖的其他的类的初始化过程,不是通过手动编码的方式创建,而是通过技术手段可以把其他的类的已经初始化好的实例自动注入到目标类中。...那我们看看这桥梁是怎么工作的: Component需要引用到目标类的实例,Component会查找目标类中用Inject注解标注的属性,查找到相应的属性后会接着查找该属性对应的用Inject标注的构造函数...(这时候就发生联系了),剩下的工作就是初始化该属性的实例并把实例进行赋值。...因此我们也可以给Component叫另外一个名字注入器(Injector) component.png 小结下 目标类想要初始化自己依赖的其他类:用Inject注解标注目标类中其他类 用Inject注解标注其他类的构造函数...Provides最终解决第三方类库依赖注入问题 Module中的创建类实例方法用Provides进行标注,Component在搜索到目标类中用Inject注解标注的属性后,Component就会去Module
找到【SqlCommand mycmd = new SqlCommand();】这条语句,
关于Dagger2这种依赖注入框架的好处在这只简单的提一下 依赖的注入和配置独立于组件之外 依赖对象是在一个独立、不耦合的地方初始化。当初始化方式改变的时候修改的代码少。...2 Dagger2的套路 2.1 最简单的运用 最简单的Dagger2运用只采用两个注解@Inject和@Component即可。因为本身@Inject就自带两个作用。...这个PersonComponent 与纯粹用@Inject方式提供依赖不同,还需要有一个modules属性指向DataModule 。...若存在参数,则从步骤1开始初始化每个参数 若不存在创建类方法,则查找该类型的类中有@Inject标记的构造方法,查看构造方法中是否有参数 若构造方法中无参数,则直接初始化该类实例,一次依赖注入到此结束。...Component有3种组织方式: 依赖方式——一个Component可以依赖一个或多个Component,采用的是@Component的dependencies属性。
MainActivity依赖于MainPresenter,这里要注意的是,使用@Inject时,不能用private修饰符修饰类的成员属性。...这种联系我们可以这样理解,当看到某个类被@Inject标记时,就会到他的构造方法中,如果这个构造方法也被@Inject标记的话,就会自动初始化这个类,从而完成依赖注入。...我们来重新理一遍上面的注入过程,首先弄清楚以下几个概念: @Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类 @Module 带有此注解的类,用来提供依赖,...(MainActivity activity); } 同时里面声明了一个inject方法,方法参数为ManActivity,用来获取MainActivity实例,以初始化在里面声明的MainPresenter...所以在DaggerMainComponent里主要用来初始化依赖,而真正的将这些依赖于Inject关联起来的就是刚才的MainActivity_MembersInjector类,我们看看这个类里做了什么
Dagger2 是一个Android依赖注入框架。...时候,我们就不需要管这些了,只需要关联住能提供创建A 和 B的地方 ,然后在需要C的地方写下: @InjectC c; 然后在这个类的初始化地方进行注入即可。...test3 = new Test3(); } } 如果我们改为使用Dagger2的方式的话,则可以写成如下方式: 1 创建一个类 使用了注解方式,使得Dagger2能找到它。...这个inject标注的意思是,我后面的参数对象里面有标注为@Inject的属性,这个标注的属性是需要这个连接器注入进来的。...的类初始化掉,完成自动初始化的动作。
Dagger2 是一个Android依赖注入框架。...时候,我们就不需要管这些了,只需要关联住能提供创建A 和 B的地方 ,然后在需要C的地方写下: @Inject C c; 然后在这个类的初始化地方进行注入即可。...test3 = new Test3(); } } 如果我们改为使用Dagger2的方式的话,则可以写成如下方式: 1 创建一个类 使用了注解方式,使得Dagger2能找到它。...这个inject标注的意思是,我后面的参数对象里面有标注为@Inject的属性,这个标注的属性是需要这个连接器注入进来的。...的类初始化掉,完成自动初始化的动作。
那么如何来使用 Dagger2 呢?我们先来看一下使用 Dagger2 和不使用的区别。 对比 用简单的例子来说明。...我们可以发现MainActivity里没有任何有关aaa的初始化赋值,但是它还是可以调用其get()方法。这样我们就达到了解耦合的目的。...这样一个简单的例子可能看不出 Dagger2 的好处,但是你可以想象一下,如果这个 Activity 里有很多个类似 AAA 这样的类的成员变量,它们都需要初始化,有的初始化还要传参数,那么,这个 Activity...注解介绍 Dagger2中注解有:@Inject, @Component, @Module, @Provides, @Qulifier, @Scope, @Singleten 。...当Dagger2碰到使用@Inject注解的变量时,会去寻找这个变量对应的被@Inject注解的构造函数,把实例构造出来,为变量提供依赖。
@Inject 给一个类的相应的属性做标记时,说明了它是一个依赖需求方,需要一些依赖。 @Inject 给一个类的构造方法进行注解时,表明了它能提供依赖的能力。...另外,还有一种特殊情况就是,像在 Android 中,MainActivity 这样的代码是我们自己编写的,所以我们可以给相应的属性添加 @Inject 注解,但是 MainActivity 对象的创建却是由...Android Framework 框架决定的,那么,Dagger2 有没有针对这种内部拥有 @Inject 标注的属性,但还没有进行依赖绑定的类的对象进行依赖注入呢?...name = "TestLazy"; } return name; } } 只有调用 TestLazy 实例的 getName() 方法时,name 才会被初始化...(ThirdActivity activity); } 只需要在 @Component 中的 dependencies 属性取值为相应的依赖就可以了。
这篇文章会分享一下实际应用中的Dagger2如何使用,以及Dagger2通过apt插件如何给我们生成代码,以及生成的代码之间的关联。...AppComponent需要初始化依赖的两个Module(AppModule和RetrofitModule),这里生成的DaggerAppComponent是通过构建者模式进行初始化的。...@Inject MainActivityPresenter presenter; 注意1:但是在整个MainActivity中却找不到初始化的过程,再看providers()方法中的代码,跟App中有区别的是...Component,Module,编译之后Dagger2就会通过apt插件生成一系列代码。...MainActivityContract.View { @Inject MainActivityPresenter presenter; } Dagger2就会自动生成MainActivity_MembersInjector
经过一段时间的纠结和水深火热,终于渐渐领悟了Dagger2,在此分享一下学习心得,希望同样对Dagger2水深火热的你们有点帮助。 接下来会分享一系列Dagger2内容。...-@Inject:需要用@Inject注解的地方主要有3,如下 用于标注需要被实例化的对象 提供实例化对象的构造函数 当类被实例化对象之后,需要马上执行的方法 public class A {...@Inject B b;//需要被实例化的对象 } public class B { @Inject//提供对象的实例化构造函数 public B() { }...@Inject//当构造函数被执行之后,立马执行改方法 public void setPresenter(){ xxx; } } -最关键的是执行编译之后 Dagger2会自动生成很多类文件...DaggerXXX,这里的XXX就是用@Component标注的接口名,比如生成了DaggerAppComponent类文件,该类文件实现了AppComponent接口,并且根据相关的@Module提供的实例进行初始化
Dagger2具有以下好处: 1) 依赖的注入和配置独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库。...使用 Dagger2 创建依赖对象,我们就不用手动初始化了。...Dagger2 通过注解来生成代码,定义不同的角色,主要的注解有:@Inject、@Module 、@Component 、@Provides 、@Scope 、@SubComponent 等。...Dagger2注解解释: 接下来介绍Dagger2中的每一个概念: @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。...最终我们初始化 component然后调用inject()方法注入成员变量。
,那么在这一章中,我们将逐渐入门Dagger2。...Car类 public class Car { @Inject Engine engine; @Inject Seat seat; @Inject Wheel wheel;...但是Dagger2为了解耦,提供了一个中介,@Component注解,也就是我们的第4步。...我们用到了@Inject注解, @Inject Engine engine; 上面的代码表示engine这个属性你不用像一般情况去初始化(engine= new Engine()),它能给你自动寻找依赖...这章主要是入门了Dagger2,下面我们会了解 1 为什么要使用Dagger2来替代文章一开头的写法? 2 如果@Inject注解的构造器有多个怎么办? 3 如果存在依赖链怎么办呢?
领取专属 10元无门槛券
手把手带您无忧上云