gpt4 book ai didi

spring - Spring中 "constructor based injection"和 "autowire by constructor mode"有什么区别

转载 作者:行者123 更新时间:2023-12-05 01:45:55 24 4
gpt4 key购买 nike

我知道并理解基于构造函数的注入(inject)。但是, Autowiring 模式让我感到困惑。1) 我读到 Autowiring 的默认模式是“无 Autowiring ”,即我们必须在 xml 文件中手动设置属性。但是,基于 xml 的配置不是一种 Autowiring 吗?它怎么能被认为是“无 Autowiring ”?2) 其他 Autowiring 模式是 i) byName ii) byType iii) constructor iv) auto-detect。我的假设是否正确:

a) 当使用基于 xml 配置的 Autowiring 时,默认模式是“byName”(即我必须保持属性引用的名称与用作属性的 bean 的名称相同。)

b) 当使用注解时,默认模式是'byType'(无论@Autowired关键字放在什么地方,即在setter上,在构造函数上或在属性上,它都会搜索被自动写入的属性的类型)

3) 基于构造函数的注入(inject)和 Autowiring 的“构造函数”模式有什么区别?(我读到构造函数模式意味着它对所有构造函数参数应用 byType 模式,但它与将 @Autowired 关键字放在构造函数)

4) 我知道要在注释中启用 Autowiring 模式 byName,在 xml 文件的 bean 定义中,我必须使用“autowire = 'byName' ”。但是,假设我只使用注释配置(使用@Component,并且在 xml 中没有 bean 定义),并且我想使用 byName Autowiring 模式,那么这样做的方式是什么?

最佳答案

我觉得你有点糊涂了。首先,您需要了解依赖注入(inject)(参见 here)。有大量关于 DI 的信息,但简而言之,这意味着某些第三方(例如 spring IOC)将依赖项传递给对象而不是对象自己创建/获取引用。这可能通过构造函数或 setter 发生。例如,考虑构造函数 DI

class B{
}

class A{
private B b;
public A(B b){
this.b = b;
}
}

某些第三方会将 B 类的实例注入(inject) A 而不是 A 类创建对 B 本身的引用。很多时候,您会使用一个接口(interface),因此类 A 甚至不知道将向其中注入(inject)什么对象。

现在在 Spring 中有不同的方法来配置对象之间的这些关联(上面的示例)。您可以使用 XML、Java Config 或 Autowiring 。他们是独立的,但做同样的事情。

在 XML 和 JAVA 配置中,您需要显式配置依赖项 - 在 xml 文件中或为 JAVA 配置使用 @Configuration 类并使用 @Bean 注释 bean。 Autowiring 是不同的。在那里您可以创建简单的 POJO,您可以使用 @Component、@Controller、@Service 或 @Repository 对其进行注释。它们将通过组件扫描自动注册为 beans。使用 Autowiring ,您不需要在 XML 文件或 JAVA Config 类中显式配置依赖项。您可以直接在代码中完成。例如,如果我们必须使用前面的示例比较 java 配置与 Autowiring

Java Config (explicit config in a config class)

@Bean
public A getA(){
return new A(new B());
}

Autowiring (implicit - done in code)

@Component
class B{
}

@Component
class A{
private B b;

@Autowired
public A(B b){
this.b = b;
}
}

在后者中,我们将类 B Autowiring 到类 A(由于 @Component 注释,它们都将注册为 bean),而无需在 xml 文件或 java 配置类中显式定义此关联。我希望这是有道理的。

关于spring - Spring中 "constructor based injection"和 "autowire by constructor mode"有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39235095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com