问题标签 [constructor-injection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Spring框架中的Java配置
我有课程A
,B
以及他们的实现AImpl
,BImpl
.
要在 Guice 中配置依赖项,我会像这样编写 smt
在春天我可以做 smt like
有几个缺点
- 我应该写下 AImpl 在 2 个地方(构造函数和配置)需要 B。
- 我应该编写更多代码(CImp 和 AImpl 需要创建方法而不是一个表达式)
有没有办法在不做 xml 的情况下改进我的 spring 配置?
upd 我也不想用 @Component 之类的 spring 相关注释来污染我的类。我更喜欢构造函数注入而不是任何其他类型的注入。扫描也不是优选的解决方案。那么,我可以用 Guice 的方式做 Spring 吗?
更新2
所以我想要存档
- 自动装配
- 构造函数注入
没有
- XML
- 路径扫描
default - 带有拦截器的 CDI bean 是否应该具有默认构造函数?
我有一个 CDI bean,并且在这个 bean 的一个方法中添加了一个拦截器。如果这个 bean 没有默认构造函数(我使用构造函数注入)。在运行时,我得到了异常
如果我在这个bean中添加一个默认构造函数,或者删除拦截器,就可以了。其实我可以使用字段注入来处理这个问题。
但我想知道:如果我添加一个默认构造函数,这意味着这个 bean 有两个构造函数——一个是非参数的,另一个是@Inject
ed 参数。在这种情况下(使用拦截器),容器会创建两次实例吗?
编辑:我使用 Tomee1.5,WebShpere8.5 与 Tomee1.5 相同,GlassFish3.1.2 似乎没有这个问题。
编辑:我在 Tomee 用户论坛中找到了一个答案,即 CDI 容器将为您的 bean 调用 @Inject 带注释的 ct,但将使用默认 ct 来创建代理。所以,我认为这意味着如果你想使用构造函数注入,你还需要一个默认构造函数来进行代理。
编辑:
根据http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443 ,除非bean具有默认范围@Dependent,否则容器必须通过间接所有注入的bean引用一个代理对象。
根据 //openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html CDI 容器将为您的 bean 调用 @Inject 带注释的构造函数,但将使用默认构造函数来创建代理。因此,所有 'NormalScoped' (@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped) bean 都需要默认构造函数,因为它们总是会被代理。
如果一个bean使用了interceptor,根据报错信息,OpenWebBean使用Proxy来处理interceptor,所以被拦截的类必须有default构造。但是 Weld 使用拦截器和装饰器的子类。https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel 子类化解决方案优于代理,因为它避免了处理许多问题例如:在代理实例上没有无参数构造函数和字段访问的拦截类。所以,如果我使用 Tomee 和 Websphere,它需要一个默认 ct,但 GlassFish 不需要。
谢谢brandizzi,这是我的第一个问题。谢谢您的帮助。似乎我无法回答我自己的问题并发布两个以上没有 10 个声誉的链接,所以我在这里进行了编辑。
c# - 单元测试构造函数注入
假设我的Foo
班级有以下内容:
到目前为止,我对构造函数进行了一个单元测试,我在其中传入 null 以验证是否ArgumentNullException
抛出了一个。我是否需要对我的构造函数进行第二次单元测试,在其中我传入一个有效IService
并验证该this.service
设置(这将需要一个公共访问器)?
或者我应该只依靠我的单元测试Start
来测试这个代码路径的方法吗?
c# - Ninject 可以使用匿名委托(func)作为 ConstructorArgument 吗?
我有一个存储库抽象类,它封装了几乎所有的 CRUD 功能:
该KeyCompare
属性在派生类中像这样使用,以便基类知道如何隔离存储库中的单个项目(并非所有“实体”都具有“Id”属性,并且某些键跨越多个列 - 此解决方案试图解决该特定点):
该KeyCompare
属性实际上是允许派生类仅实现该UpdateExisting
方法的基石,如下所示:
其余的(实际的 CRUD)全部由基类处理。有了这个抽象存储库,我已经在几分钟甚至几秒钟内实现了具体的存储库,只编写了特定于每个实现的代码。干我渴了。
DataRepository<T>
处理 SQL Server,所以我需要另一个模拟实现,我已经调用它ListRepository<T>
并且做几乎完全相同的事情(除了Context
和Transaction
属性都 return null
)。我认为构造函数的签名就是我需要在这里发布的全部内容:
所以现在我已经准备好进行测试了,我想使用 Ninject 作为我的 IoC 容器。我的问题是我似乎无法弄清楚如何将匿名委托作为ConstructorArgument
:
我正在尝试做的事情是可行的,还是过于复杂?我不会问它是否是好/干净的代码,但欢迎在这里提出建设性意见:
c# - 在构造函数中结合依赖和值
我经常遇到一个问题,即有一个类既需要依赖项又需要初始化一些字符串值。例如考虑以下代码:
它的问题在于,由于附加的字符串参数,将其从 DI 容器中取出并不容易。解决此问题的最佳方法是什么?这些是我能想到的方式:
- Initialize 方法(这还不够好,因为它提供了 Mark Seeman 定义的时间耦合,我同意这不是一个很好的方法)
- 抽象工厂(我真的不需要额外的间接层,因为参数是一个配置,我在做配置的时候就知道了)
- 与示例中一样使用并在 DI 容器中注册类的实例
java - 运行 JUnit 测试后 Bean 创建异常,而相同的 bean 配置在 Application Server 中运行而没有失败
我正在为 Web 应用程序上下文和 Junit 测试用例使用类似的 Spring bean 定义。它在运行测试用例时抛出org.springframework.beans.factory.BeanCreationException ,而在成功运行的 Web 应用程序上下文中使用相同的 bean 配置。这是失败的bean定义:
这是JackRabbitManagerImpl类的构造函数的签名:
这是唯一有两个参数的构造函数。
在运行测试用例时,bean jackRabbitManager的依赖关系已成功创建。它在创建jackRabbitManager时抛出org.springframework.beans.factory.BeanCreationException。这是异常的堆栈跟踪
我试图通过为构造函数参数提供类型来消除构造函数注入的歧义。但我仍然遇到同样的问题。
相同的 bean 定义在 Web 应用程序上下文中成功运行。请帮助我克服这个问题。
java - 春天元素必须指定一个引用或值
我在使用 Spring 和构造函数注入时遇到问题。我想动态创建具有名称 ( String
) 和特殊 ID ( long
) 的对象。
但是当加载 spring.xml 文件时会发生异常。
线程“主”java.lang.ExceptionInInitializerError 中的异常
原因:org.springframework.beans.factory.UnsatisfiedDependencyException:创建在类路径资源[spring.xml]中定义的名称为“someBean”的bean时出错:通过类型为[long]的索引0的构造函数参数表示不满足的依赖关系:构造函数参数不明确类型 - 您是否指定了正确的 bean 引用作为构造函数参数?
我的spring.xml:
那么那里有什么问题呢?构造函数参数的索引为 1(而不是 0,如异常所说)
c# - 依赖注入,需要相同类型接口字典的类是个好主意吗?
虽然我在Code Review中问过这个问题,但原始代码现在正在蔓延。是的,我也是清洁代码讲座的忠实粉丝,刚刚看了那些很棒的视频,我也看到了另一个问题。这与我最初遇到的问题相同。
我有一门课说人类。人类基于其 Travel 方法中的某些决定可以调用 Horse、Camel 或 Ship To Travel,也可以要求所有这些人(在某些情况下) Travel。
所有的 Horse、Camel、Ship 都有 ITransport 接口,当然这个接口有 Travel 方法。
最初的问题是,在我的项目的生命周期中,我可能会得到一些新的交通工具,比如飞机、火箭、潜艇等。
所以我不能简单地将它们作为 ITransport 船、ITransport 马......等在构造函数中传递,因为我的构造函数参数将继续膨胀。
因此,我按照建议(我认为)提出了一个解决方案,即 HumanFactory 应该有一个事件,并且该事件应该在 Human 类的构造函数中传递。
尽管我以某种方式删除了我的大型运输列表,但正如您所知,接口可以有很多方法。所以现在我需要传递大量的委托,每个委托都对应于接口的一个方法,当然也需要根据需要传递。
我什至试图通过创建一个 Human Mapper 类来解决这个问题,该类的唯一职责是映射到正确的传输,调用正确的事件。这行得通!
现在,由于这是一个虚构的例子,在现实世界的例子中,接口的方法接受参数,那么我将如何处理呢?
我认为我要去的方向是创造一个维护噩梦。
我正在粘贴代码以供快速参考。
我的运输工厂是:
建议后我的人类班变成了:
我现在有一个人类类工厂,正如建议的那样:
我谈到了一个 Mapper 类,它将正确的传输映射到正确的方法(它看起来很丑,但这是我想出的最好的 :)):
现在看到在这种情况下,For Travel 方法如果有两个参数,那么委托签名会改变,如果 ITransport 接口中有四五个方法,那么请上帝帮助我。
我希望我已经在这里解释了我的问题。谢谢
编辑:我正在从这个问题中删除一些明显的代码,以使其更具可读性,而且它也变得更加冗长
c# - Ninject WithConstructorArgument 没有覆盖类型的全局绑定?
我有我的一般绑定,其中之一是:
这很好用,因为有几个类使用这个哈希。但是,有一个或两个控制器需要另一种类型的散列器才能将散列与 3rd 方一起使用,例如需要 md5 散列的 gravatar。那么我执行以下操作:
然后我的控制器看起来像:
在调试时,我希望 IHasher 是 Md5Hasher,但它是一个 Sha256Hasher。那么这是预期的行为以及使其使用覆盖类型的任何方法吗?