依赖注入是一种将依赖对象传递给其他对象的实践。Spring有两种类型的依赖注入:
基于构造函数的Injection -When容器调用类的构造函数。它应用于强制性依赖项。
假设X类紧密依赖于Y类,那么我们应该使用基于构造函数的注入。
基于Setter的注入-可以通过在bean上调用setter方法来使用它。它应该用于可选的依赖项。
两种类型的注入都有其优缺点。以下是一些差异的列表-
序号 | 键 | 基于构造函数的注入 | 基于二传手的注入 |
---|---|---|---|
1 |
圆 |
不允许创建循环依赖 |
它不检查循环依赖 |
2 |
订购方式 |
基于构造函数的DI固定需要注入依赖项的顺序。 |
基于Setter的DI帮助我们仅在需要时才注入依赖,而不是在构造时要求依赖。 |
3 |
MutilThread环境 |
结合最终字段,构造函数注入在多线程环境中提供了额外的安全性 |
二传手注入没有额外的好处 |
4 |
Spring代码生成库 |
Spring代码生成库不支持构造函数注入,因此将无法创建代理。它将迫使您使用无参数构造函数。 |
Spring框架级代码使用setter注入 |
5 |
用例 |
应该用于强制性依赖 |
它应该用于可选的依赖项。 |
public class ConstructorInjectionExample { public ConstructorInjectionExample(BaseExmp baseExmp) { //...- } } <beans> <bean id = "ConstructorInjectionExample" class = "x.y.ConstructorInjectionExample"> <constructor-arg ref = "baseExmp"/> </bean> <bean id = "baseExmp" class = "x.y.BaseExmp"/> </beans>
public class SetterInjectionExample { html" target="_blank">public void setBaseExmp(BaseExmp baseExmp) { this.baseExmp = baseExmp; } } <beans> <bean id = "setterInjectionExample" class = "x.y.SetterInjectionExample"> <property name = "baseExmp" ref = "baseExmp"/> </bean> </beans>
问题内容: 我有一堂课: 配置文件 我如何将其注入一些构造函数,即: 我希望此字符串具有从Config注入的值。那可能吗? 问题答案: 您将必须命名Bean,然后在自动装配引用该名称时使用注释。 例: 配置文件 SomeC.java
请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。
大家都知道@Autowired(@Inject etc)注释是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired注释的字段和setter,但构造函数呢?这是bean后处理器,这意味着它是在已经创建bean之后调用的,但是构造函数也可以标记为@Autowired,那么如何创建这样的bean呢?
我把下面的内容看做是构造函数和setter注入的区别之一。有人能用一些简单的例子解释一下下面的区别吗,我对术语完全功能对象和不完全对象有点困惑。 -
注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj
我想在构造函数中使用Request类,这是我想运行服务器时它给我的错误: 无法自动连接服务"AppBundle\Controller\DetectServiceDetailController":方法"__construct()"引用类"Symfony\Component\HttpFoundation\Request"的参数"$ask",但不存在这样的服务。它不能自动注册,因为它来自不同的根命名空